使用动态属性源进行上下文配置
从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 ...
}