我正在为Spring Boot(1.3.1)应用程序设置集成测试。在上下文启动时,我的应用程序从数据目录中读取其状态,该数据目录在生产中由application.properties提供:
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会有所帮助,那很好。)
答案 0 :(得分:0)
您可以使用弹簧配置文件。因此,在测试运行配置文件测试中,为每个配置文件定义不同的应用程序属性
application-{profile}.properties
Spring profile application properties
查看第24.4节