我有一個BaseTest類,它由幾個測試組成。每個測試都應針對每個配置文件I列表執行。Spring Boot/JUnit,運行多個配置文件的所有單元測試
我想過使用參數值,如:
@RunWith(Parameterized.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
// @ActiveProfiles("h2-test") // <-- how to iterate over this?
public abstract class BaseTest {
@Autowired
private TestRepository test;
// to be used with Parameterized/Spring
private TestContextManager testContextManager;
public BaseTest(String profile) {
System.setProperty("spring.profiles.active", profile);
// TODO what now?
}
@Parameterized.Parameters
public static Collection<Object[]> data() {
Collection<Object[]> params = new ArrayList<>();
params.add(new Object[] {"h2-test" });
params.add(new Object[] {"mysql-test" });
return params;
}
@Before
public void setUp() throws Exception {
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
// maybe I can spinup Spring here with my profile?
}
@Test
public void testRepository() {
Assert.assertTrue(test.exists("foo"))
}
我怎麼會告訴Spring來運行這些不同的配置文件每個測試?實際上,每個配置文件都會與不同的數據源(內存中的h2,外部的mysql,外部oracle,...)進行通信,因此我的存儲庫/數據源必須重新初始化。
我知道,我可以指定@ActiveProfiles(...),我甚至可以從BaseTest延伸和覆蓋ActiveProfile註解。雖然這會起作用,但我只顯示我的測試套件的一部分。很多我的測試類都是從BaseTest擴展而來的,我不想爲每個類創建幾個不同的配置文件存根。目前的工作,但醜陋的解決方案:
- BaseTest(@ActiveProfiles( 「MySQL的」))
- FooClassMySQL(註釋從BaseTest)
- FooClassH2(@ActiveProfiles( 「H2」))
- BarClassMySQL(註釋從BaseTest)
- BarClassH2(@ActiveProfiles( 「H2」))
- FooClassMySQL(註釋從BaseTest)
感謝
爲什麼不用參數運行所有測試,例如如果你使用Maven,它可能是'mvn test -Dspring.profiles.active = test'。我不確定你是否可以通過這個參數化的類來實現它,主要是因爲在它開始執行測試之前,Spring很可能會啓動它的上下文,並且在此之前必須設置活動配置文件。 –
謝謝。非常好的解決方案,我沒有想過。如果沒有一種優雅的方式來處理它,這肯定會做到!我認爲唯一的問題可能是隻有少數測試(實際上,我所有的存儲庫/ jpa測試)需要不同的配置文件,而其他的則不需要訪問不同的配置。 – Frame91
酷!如果它適用於您,我會將其添加爲答案。 –