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

使用动态属性源的上下文配置

从 Spring Framework 5.2.5 开始,TestContext 框架通过@DynamicPropertySource注解。此注释可用于 需要将具有动态值的属性添加到集合PropertySourcesEnvironment对于ApplicationContextloaded 的 集成测试。spring-doc.cadn.net.cn

@DynamicPropertySourceAnnotation 及其支持基础设施是 最初设计为允许基于 Testcontainers 的测试中的属性很容易地暴露给 Spring 集成测试。但是,此功能也可以与任何形式的 外部资源,其生命周期在测试的ApplicationContext.spring-doc.cadn.net.cn

@TestPropertySource注解,以及@DynamicPropertySource必须申请 更改为static方法,该方法接受单个DynamicPropertyRegistry参数,即 用于将名称-值对添加到Environment.值是动态的,并通过 一个Supplier仅当解析属性时,才会调用该属性。通常,方法 引用用于提供值,如以下示例所示,该示例使用 Testcontainers 项目来管理 Spring 之外的 Redis 容器ApplicationContext.托管 Redis 容器的 IP 地址和端口已创建 可用于测试的ApplicationContext通过redis.hostredis.port性能。这些属性可以通过 Spring 的Environment抽象或直接注入到 Spring 管理的组件中 —— 例如,通过@Value("${redis.host}")@Value("${redis.port}")分别。spring-doc.cadn.net.cn

如果您使用@DynamicPropertySource在基类中,并发现子类中的测试 失败,因为 Dynamic 属性在子类之间发生了变化,你可能需要注解 你的基类替换为@DirtiesContext自 确保每个子类都有自己的ApplicationContext使用正确的动态 性能。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