Spring Boot MongoRepository @Rollback用于测试

时间:2016-07-13 14:14:58

标签: java spring testing rollback mongorepository

我在Spring Boot中为MongoRepository编写了一个Test,测试工作正常。唯一的问题是,当测试结束时,我想要回滚,这样测试就不会对数据库造成任何影响。

// 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()));
    }
}

我在@Rollback之前放了@Transactional,但是得到了这个错误:

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!

3 个答案:

答案 0 :(得分:2)

据我所知,没有针对MongoDB的Spring的TransactionManager的实现,因为它在ACID意义上不是事务性的。所以不,你不能在MongoDB中使用@Transactional注释,你必须手动完成所有的清理工作,否则就要使用DBUnit并为MongoDB添加你自己的扩展。

答案 1 :(得分:1)

现在,您可以将@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

答案 2 :(得分:0)

我猜您使用try catch块。如果可以避免尝试捕获,那就更好了。无论如何,如果您需要回滚,可以这样做。

var dateAndUsername = await _dbContext.Holidays
    .Select(x => new {x.Date, x.Username})
    .ToArrayAsync();

Dictionary<DateTime, List<string>> grouped = dateAndUsername
    .GroupBy(x => x.Date)
    .ToDictionary(x => x.Key, x => x.Select(y => y.Username).ToList());