具有动态属性的@TestPropertySource

Vla*_*mir 8 spring spring-mvc spring-test spring-boot

我正在使用@TestPropertySource覆盖我的集成测试中的application.yml属性,以用于Spring启动应用程序.

@TestPropertySource(properties = { "repository.file.path=src/test/resources/x" })
Run Code Online (Sandbox Code Playgroud)

我想知道是否有某种方法可以使属性VALUE动态化.像这样的东西:

 @TestPropertySource(properties = { "repository.file.path=PropertyValueProvider.class" })
Run Code Online (Sandbox Code Playgroud)

感谢您的反馈.在我的情况下,属性值是系统特定的,应该在测试运行时生成.

Sam*_*nen 12

@TestPropertySource仅提供用于配置s的声明性机制PropertySource.Spring参考手册中的文档.

如果您需要添加一个纲领性支持PropertySourceEnvironment,你应该实现一个ApplicationContextInitializer可通过注册@ContextConfiguration(initializers = ...).Spring参考手册中的文档.

问候,

Sam (Spring TestContext Framework的作者)

  • 我发现了[这个例子](https://github.com/spring-projects/spring-boot/blob/8dd1354d82be9bae236e3e8804c82f0987c42729/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework /boot/test/autoconfigure/data/redis/DataRedisTestIntegrationTests.java#L93) 来展示它在实践中是如何完成的。 (6认同)

Amr*_*eja 10

您还可以使用@DynamicPropertySourceSpring Boot 5.2 中的注释来执行此操作。这使您能够以编程方式(动态)设置属性值。

请参阅:https ://github.com/spring-projects/spring-framework/issues/24540

将其添加到您的集成测试类中:

@DynamicPropertySource
static void dynamicProperties(DynamicPropertyRegistry registry) {
  registry.add("my.property", () -> {
       // some logic to get your property dynamically
   });
}
Run Code Online (Sandbox Code Playgroud)