@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 = ...)
注册的 ApplicationContextInitializer
。 Documentation 在 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
});
}
我正在使用@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 = ...)
注册的 ApplicationContextInitializer
。 Documentation 在 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
});
}