[英]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.