我有一个spring-boot应用程序(spring-boot2.2.6(,我正在尝试准备一个集成测试环境(嵌入在应用程序中(;我有一个初始化嵌入式弹性搜索服务的方法;
在测试阶段,如何在SpringContext开始初始化之前运行该方法?目前,Spring初始化,并抱怨无法建立与嵌入的弹性搜索的连接。
在Spring Boot 2.2.6和Spring Framework 5.2.5中提供了添加动态属性的附加选项
@DynamicPropertySource
static void dynamicProperties(DynamicPropertyRegistry registry) {
registry.add("spring.application.name", () -> "name");
}
这可以用于设置任何类型的动态属性,并且是Inializer模式的替代品。
一个更大的例子可以在Spring博客上看到
https://spring.io/blog/2020/03/27/dynamicpropertysource-in-spring-framework-5-2-5-and-spring-boot-2-2-6
它将这个例子与Testcontainers结合起来,为运行在docker容器中的Neo4J设置一个动态数据库URL
@SpringBootTest
@Testcontainers
class ExampleIntegrationTests {
@Container
static Neo4jContainer<?> neo4j = new Neo4jContainer<>();
@DynamicPropertySource
static void neo4jProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.neo4j.uri", neo4j::getBoltUrl);
}
}
您可以创建一个自定义初始值设定项:
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
// initialize...
TestPropertyValues
//here you can add properties to connect...
.of("some.property.key=some.property.value")
.applyTo(configurableApplicationContext.getEnvironment());
}
}
并将这个初始化器添加到您的测试类中:
@ContextConfiguration(initializers = Initializer.class)