簡體   English   中英

如何在Spring中真正地單獨運行每個集成測試,或者至少在每個測試之前運行所有命令行運行器?

[英]How to run each integration test truly individually in Spring, or at the very least run all commandlinerunners before each test?

我有一個Spring Boot應用程序,正在使用spring-boot-starter-test。

我有一堆集成測試,這些測試使用REST調用將數據插入到應用程序中。 我用@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)運行它們

每次測試后,我都會在數據庫中得到一些數據。 我希望每個測試都是真正獨立的,但是我還沒有找到一種方法。 我嘗試將@Rollback放在每個測試中,但是由於我是通過REST調用從外部插入數據,因此可以理解這是行不通的。

因此,以前我只是通過執行刪除查詢(即類似Query deleteProjects = entityManager.createQuery("DELETE FROM Project"); deleteProjects.executeUpdate();類的方法,以相當低級的方式來刪除測試之間的所有數據Query deleteProjects = entityManager.createQuery("DELETE FROM Project"); deleteProjects.executeUpdate();在測試后為每個實體。

但是,我最近添加了將在CommandLineRunner中創建的管理員用戶帳戶。 我發現此CommandLineRunner對於所有組合的測試也僅運行一次,因此在第一個測試完成並且刪除了所有數據之后,我失去了管理員角色。

什么是設置此內容的好方法? 我意識到啟動整個應用程序需要花費一些時間,因此全新的啟動將不是理想的選擇。 告訴Spring在每次測試之前運行CommandLineRunner的一種方法會很好。 我不想自己實例化並運行它,那會很麻煩,而且我不確定這在交易方面如何工作。 我可以從查詢中刪除該管理員用戶帳戶,但是我仍然在整個系統中亂砍。

當前,您有一個麻煩的問題,那就是需要擁有該管理員帳戶,而該管理員帳戶必須具有Spring上下文。 我發現執行此操作的一個好方法是擁有一個Spring Profile @Profile("test")並將其放在創建該管理員帳戶所需的某個Component上:

@Component
@Profile("test")
public class CreateAdminBean {
    @Autowired
    UserRepo repo;

    public CreateAdminBean() {
        // TODO your job but something like:
        User admin = new User();
        admin.setAdmin(true);
        repo.create(admin);
    }
}

如果要使測試真正彼此獨立,則需要每次都重新創建上下文,並確保每次擦除數據庫。 這將花費您時間,而IMO是不必要的,但是如果您有自己的理由,則有自己的理由。 我個人會嘲笑所有服務。

您只需將數據庫JPA Hibernate設置為spring.jpa.hibernate.ddl-auto= create-drop 我通常不這樣做,只是有一個清除所有表並在每次測試后運行的方法,但這不是您在問題中要問的,我希望看到一個@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)在您的測試代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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