@TestPropertySource 具有动态属性

@TestPropertySource with dynamic properties

我正在使用@TestPropertySource 来覆盖 application.yml 集成测试中的 spring 启动应用程序属性。

@TestPropertySource(properties = { "repository.file.path=src/test/resources/x" })

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

 @TestPropertySource(properties = { "repository.file.path=PropertyValueProvider.class" })

感谢您的反馈。在我的例子中,属性 值是系统特定的,应该在测试时生成 运行.

@TestPropertySource 仅提供 声明式 配置 PropertySource 的机制。 Documentation 在 Spring 参考手册中。

如果您需要编程支持将 PropertySource 添加到 Environment,您应该实现一个可以通过 @ContextConfiguration(initializers = ...) 注册的 ApplicationContextInitializerDocumentation 在 Spring 参考手册中。

此致,

Sam (Spring TestContext 框架的作者)

感谢

我做到了

示例代码如下:

@ContextConfiguration(classes = { MyConfiguration.class }, initializers = { MyInitializer.class })
public class MyContextConfiguration {
    public static class MyInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            String userNameLower = System.getProperty("user.name").toLowerCase();
            Map<String, Object> dynamicProperties = Map.of("user.name.lower", userNameLower);
            MapPropertySource propertySource = new MapPropertySource("dynamic", dynamicProperties);
            applicationContext.getEnvironment().getPropertySources().addLast(propertySource);
        }
    }

    @Configuration
    @PropertySource("classpath:my-static.properties") // properties in this file can reference ${user.name.lower}
    public static class MyConfiguration {
        @Bean
        public MyBean myBean(@Value("${user.name.lower}") String userNameLower) {
            return new MyBean(userNameLower);
        }
    }
}

您也可以使用 Spring Boot 5.2

中的 @DynamicPropertySource 注释来执行此操作

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

将此添加到您的集成测试中 class:

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