|
此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
使用动态属性源进行上下文配置
Spring TestContext 框架通过DynamicPropertyRegistry这@DynamicPropertySource注释,以及DynamicPropertyRegistrar应用程序接口。
|
动态属性源基础设施最初设计为允许属性来自基于测试容器的测试轻松暴露给 Spring集成测试。但是,这些功能可以与任何形式的外部资源一起使用其生命周期在测试之外进行管理 |
优先
动态属性的优先级高于加载的属性@TestPropertySource, 作系统的环境、Java 系统属性或属性源应用程序通过使用@PropertySource或以编程方式。 因此 动态属性可用于有选择地覆盖通过@TestPropertySource、系统属性源和应用程序属性源。
DynamicPropertyRegistry
一个DynamicPropertyRegistry用于将名称值对添加到Environment. 值是动态的,通过Supplier仅当属性被解析时才会调用。通常,方法引用用于提供值。以下部分提供了如何使用DynamicPropertyRegistry.
@DynamicPropertySource
与@TestPropertySource在类级别应用的注释,@DynamicPropertySource可应用于static方法,以便将具有动态值添加到集合中PropertySources在Environment对于ApplicationContext已加载以进行集成测试。
集成测试类中用@DynamicPropertySource必须 是static并且必须接受单个DynamicPropertyRegistry论点。 请参阅类级 javadocDynamicPropertyRegistry了解更多详情。
|
如果您使用 |
以下示例使用 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 ...
}
DynamicPropertyRegistrar
作为实施的替代方法@DynamicPropertySource集成测试中的方法类,您可以注册DynamicPropertyRegistrarAPI 作为 bean在测试的ApplicationContext. 这样做可以支持其他用途使用@DynamicPropertySource方法。 例如,由于DynamicPropertyRegistrar本身就是ApplicationContext,它可以与上下文中的其他 bean 进行交互,并注册源自那些 bean。
测试中的任何 beanApplicationContext实现DynamicPropertyRegistrar接口将在单例pre实例化阶段之前自动检测并急切初始化,并且accept()此类 bean 的方法将使用DynamicPropertyRegistry执行实际动态财产登记代表注册商。
| 与其他 Bean 的任何交互都会导致其他 Bean 的预先初始化 bean 及其依赖项。 |
以下示例演示了如何实现DynamicPropertyRegistrar作为
lambda 表达式,用于注册ApiServer豆。这api.url可以通过 Spring 的Environment抽象或注入
直接进入其他 Spring 管理的组件——例如,通过@Value("${api.url}"),
以及api.url属性将从ApiServer豆。
-
Java
-
Kotlin
@Configuration
class TestConfig {
@Bean
ApiServer apiServer() {
return new ApiServer();
}
@Bean
DynamicPropertyRegistrar apiPropertiesRegistrar(ApiServer apiServer) {
return registry -> registry.add("api.url", apiServer::getUrl);
}
}
@Configuration
class TestConfig {
@Bean
fun apiServer(): ApiServer {
return ApiServer()
}
@Bean
fun apiPropertiesRegistrar(apiServer: ApiServer): DynamicPropertyRegistrar {
return registry -> registry.add("api.url", apiServer::getUrl)
}
}