[英]Spring Boot MongoRepository @Rollback for tests
我在 Spring Boot 中為 MongoRepository 編寫了一個測試,測試工作正常。 唯一的問題是,當測試結束時,我想要回滾,這樣就不會因為測試而導致數據庫發生變化。
// package...
// imports...
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MetistrafficApplication.class)
@Rollback(true)
public class AppRepositoryTests {
@Autowired
private AppRepository appRepository;
@Test
public void insertTest() {
App app = new App("test");
App appInserted = appRepository.save(app);
assertThat(appInserted.getName(), equalTo(app.getName()));
}
}
我把@Transactional 放在@Rollback 之前,但得到這個錯誤:
java.lang.illegalstateexception:Failed to retrieve PlatformTransactionManager for @Transactional test for test context
當我搜索錯誤時,我找不到任何帶有 MongoRepository 的代碼。 那么,我該如何解決這個問題?
編輯:添加@Transactional("PlatformTransactionManager")
,我得到的錯誤更改為:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'PlatformTransactionManager' is defined: No matching PlatformTransactionManager bean found for qualifier 'PlatformTransactionManager' - neither qualifier match nor bean name match!
據我所知,沒有 Spring 的 TransactionManager for MongoDB 實現,因為它在 ACID 意義上不是事務性的。 所以不,您不能在 MongoDB 中使用 @Transactional 注釋,您必須手動完成所有清理工作,或者使用 DBUnit 並為 MongoDB 添加您自己的擴展。
編輯:正如Petter在他的回答中提到的,從 MongoDB 4.0 開始,MongoDB支持 ACID 事務,您可以在 GitHub 上找到官方 SpringData 示例,並且在 Spring 的開發者博客中也有該功能的發布帖子
現在您可以在 mongo 中使用 @Transactional。 看看這個例子: https : //www.baeldung.com/spring-data-mongodb-transactions
你需要 mongo 4.0。 還需要啟用 mongo 復制( mongod --replSet rs0
)
然后你需要把這個 bean 添加到你的 spring 應用程序中
@Bean
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
這足以在您的代碼中使用@Transactional
。
我猜你用的是 try catch 塊。 如果您可以避免嘗試捕獲,那就更好了。 無論如何,如果您需要回滾,您可以這樣做。
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.