对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

带有动态属性源的上下文配置

自 Spring Framework 5.2.5 起,TestContext 框架通过@DynamicPropertySource注解。该注释可用于 需要向 集合添加带有动态值的属性的积分测试地产来源环境对于应用上下文为 积分测试。spring-doc.cadn.net.cn

@DynamicPropertySource注释及其支持基础设施 最初设计目的是让基于测试容器的测试属性能够轻松暴露于 春季积分测试。然而,这一特性也可以与任何形式的 其生命周期在测试之外维持的外部资源应用上下文.spring-doc.cadn.net.cn

@TestPropertySource在类级层面应用的注释,@DynamicPropertySource必须应用 转给静态的接受单一动态属性注册论元,该参数为 用于环境.值是动态的,通过以下方式提供 一个提供商只有在该属性被解决时才会被调用。通常,方法 引用用于提供值,如下例所示,该示例使用 Testcontainers 项目用于管理 Spring 之外的 Redis 容器应用上下文.管理 Redis 容器的 IP 地址和端口被创建 测试中的组件可用应用上下文通过redis.hostredis.port性能。这些房产可通过Spring's访问环境抽象或直接注入 Spring 管理组件——例如:@Value(“${redis.host}”)@Value(“${redis.port}”)分别。spring-doc.cadn.net.cn

如果你使用,@DynamicPropertySource在基类中发现,测试在子类中 失败是因为不同子类的动态属性不同,你可能需要注释 你的基类@DirtiesContext自 确保每个子类都有自己的子类应用上下文具有正确的动态 性能。spring-doc.cadn.net.cn

@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、系统属性源和应用属性源。spring-doc.cadn.net.cn