从TestExecutionListener

时间:2016-01-05 10:20:06

标签: java spring spring-test

我正在为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会有所帮助,那很好。)

1 个答案:

答案 0 :(得分:0)

您可以使用弹簧配置文件。因此,在测试运行配置文件测试中,为每个配置文件定义不同的应用程序属性

application-{profile}.properties

Spring profile application properties

查看第24.4节