![](/img/trans.png)
[英]How to run some code before each JUnit @Test method individually, without using @RunWith nor AOP?
[英]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.