我正在爲我的Spring Boot(1.3.1)應用程序設置集成測試。在上下文啓動我的應用程序從一個數據目錄,這在生產application.properties提供讀取它的狀態:從TestExecutionListener向ApplicationContext添加屬性
datadir.location=<path to directory>
現在,如果我只是想在我的測試中使用一個固定的目錄,我可以用@TestPropertySource像這樣:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
@WebIntegrationTest({"server.port=0", "management.port=0"})
@TestPropertySource(properties = {"datadir.location=<path to test data directory>"})
public class MyIntegrationTest {
}
不過,我想生成測試的測試數據,所以我成立了一個以TestExecutionListener的創建一個臨時目錄,並添加測試數據。測試現在看起來是這樣的:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
@WebIntegrationTest({"server.port=0", "management.port=0"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@TestExecutionListeners(listeners = {DataDirSetupListener.class}, mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS)
public class MyIntegrationTest {
public void initDataDirectory(Path pathToDataDir) {
// Setup of contents in temporary data directory goes here
}
}
的TestExecutionListener的是這樣的:
public class DataDirSetupListener extends AbstractTestExecutionListener {
public void beforeTestClass(TestContext testContext) {
Path tempDataDir = Files.createTempDirectory("datadir");
// This call asks testContext for the test class, and
// calls the initDataDirectory method
findAndCallInitDataDirectory(tempDataDir);
// TODO: Set datadir.location = tempDataDir.toString();
}
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
所以,聽者運行良好並創建數據目錄帶來的ApplicationContext前了,但什麼是正確的提供數據目錄的位置到上下文的方式?
(如果移動的datadir安裝到prepareTestInstance代替beforeTestClass將有助於東西,這很好。)
看我不知道如何將其應用到我的情況,作爲屬性值只有在DataDirSetupListener中的代碼已經運行時纔會知道。 –
如何將數據填充到此DataDirSetupListener? – Aviad
我更新了原帖。監聽器向TestContext詢問當前的測試類,並使用它來調用測試類中的initDataDirectory方法。 –