使用动态属性源进行上下文配置
从Spring Framework 5.2.5开始,TestContext框架通过@DynamicPropertySource注解提供对动态属性的支持。该注解可用于需要向集成测试中加载的ApplicationContext的Environment的PropertySources中添加具有动态值的属性。
|
|
@TestPropertySource注解相比,
@DynamicPropertySource必须应用于接受单个
DynamicPropertyRegistry参数的
static方法,该参数用于向
Environment添加
名称-值对。值是动态的,并通过
Supplier提供,仅在解析属性时才调用。通常,使用方法引用来提供值,如下例所示,该示例使用Testcontainers项目来管理Spring
ApplicationContext之外的Redis容器。托管的Redis容器的IP地址和端口通过
redis.host和
redis.port属性提供给测试的
ApplicationContext中的组件。这些属性可以通过Spring的
Environment抽象访问,或直接注入到Spring管理的组件中 - 例如,通过
@Value("${redis.host}")和
@Value("${redis.port}")。
|
如果在基类中使用 |
-
Java
-
Kotlin
@SpringJUnitConfig(/* ... */)
@Testcontainers
class ExampleIntegrationTests {
@Container
static GenericContainer redis =
new GenericContainer("redis:5.0.3-alpine").withExposedPorts(6379);
@DynamicPropertySource
static void redisProperties(DynamicPropertyRegistry registry) {
registry.add("redis.host", redis::getHost);
registry.add("redis.port", redis::getFirstMappedPort);
}
// tests ...
}
@SpringJUnitConfig(/* ... */)
@Testcontainers
class ExampleIntegrationTests {
companion object {
@Container
@JvmStatic
val redis: GenericContainer =
GenericContainer("redis:5.0.3-alpine").withExposedPorts(6379)
@DynamicPropertySource
@JvmStatic
fun redisProperties(registry: DynamicPropertyRegistry) {
registry.add("redis.host", redis::getHost)
registry.add("redis.port", redis::getFirstMappedPort)
}
}
// tests ...
}