Spring 启动 MongoRepository @Rollback 进行测试

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!

据我所知,MongoDB 没有 Spring 的 TransactionManager 的实现,因为它在 ACID 意义上不是事务性的。所以不,您不能将 @Transactional 注释与 MongoDB 一起使用,您必须手动进行所有清理,或者使用 DBUnit 并为 MongoDB.

添加您自己的扩展

编辑: 正如 mentioned in his answer, starting with MongoDB 4.0, MongoDB has support for ACID transactions and you can find the official SpringData examples on GitHub and also have the feature's release post 在 Spring 的开发者博客

现在您可以将@Transactional 与mongo 一起使用。看看这个例子: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 块。如果能避免 try catch 就更好了。不管怎样,如果你需要回滚,你可以这样做。

 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();