使用动态属性源进行上下文配置
从 Spring Framework 5.2.5 开始,TestContext 框架通过 @DynamicPropertySource
注解提供对动态属性的支持。此注解可用于集成测试,这些测试需要将具有动态值的属性添加到 Environment
中的 PropertySources
集中,以用于为集成测试加载的 ApplicationContext
。
|
与在类级别应用的 @TestPropertySource
注解形成对比,@DynamicPropertySource
必须应用于接受单个 DynamicPropertyRegistry
参数的 static
方法,该参数用于向 Environment
添加名称-值对。值是动态的,并通过 Supplier
提供,该 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 ...
}