对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
使用动态属性源的上下文配置
从 Spring Framework 5.2.5 开始,TestContext 框架通过@DynamicPropertySource
注解。此注释可用于
需要将具有动态值的属性添加到集合PropertySources
在Environment
对于ApplicationContext
loaded 的
集成测试。
这 |
与@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
、系统属性源和应用程序属性源。