簡體   English   中英

Spring Boot 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!

據我所知,沒有 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM