|
对于最新的稳定版本,请使用 Spring Framework 6.2.7! |
使用动态属性源的上下文配置
从 Spring Framework 5.2.5 开始,TestContext 框架通过@DynamicPropertySource注解。此注释可用于
需要将具有动态值的属性添加到集合PropertySources在Environment对于ApplicationContextloaded 的
集成测试。
|
这 |
与@TestPropertySource注解,以及@DynamicPropertySource必须申请
更改为static方法,该方法接受单个DynamicPropertyRegistry参数,即
用于将名称-值对添加到Environment.值是动态的,并通过
一个Supplier仅当解析属性时,才会调用该属性。通常,方法
引用用于提供值,如以下示例所示,该示例使用
Testcontainers 项目来管理 Spring 之外的 Redis 容器ApplicationContext.托管 Redis 容器的 IP 地址和端口已创建
可用于测试的ApplicationContext通过redis.host和redis.port性能。这些属性可以通过 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 ...
}
优先
动态属性的优先级高于从@TestPropertySource,
作系统的环境、Java 系统属性或由
应用程序使用@PropertySource或以编程方式。因此
动态属性可用于选择性地覆盖通过@TestPropertySource、系统属性源和应用程序属性源。