Using Property Configuration Holders with Plain Spring TestContext Framework
Jump to navigation
Jump to search
Internal
Overview
Property configuration holders are a Spring Boot pattern. They require Spring Boot dependencies and runtime to function. However, they're useful, so this is a method to get them to work with plain TestContext Framework tests. To configure tests to load configuration properties from ./src/test/resources/application.yml:
1. Add the following dependencies:
implementation('org.springframework.boot:spring-boot')
testImplementation('org.yaml:snakeyaml:1.23')
2. Configure the test with a custom initializer:
@RunWith(SpringRunner.class)
@ContextConfiguration(
classes = {...},
initializers = PropertyAwareContextInitializer.class)
public class ExampleTests {
...
}
3. This is the custom initializer:
...
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.config.ConfigFileApplicationListener;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
public class PropertyAwareTestContextInitializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
//
// expose ./src/test/resources/application.yml as a property source
//
new ConfigFileApplicationListener().postProcessEnvironment(
applicationContext.getEnvironment(), new SpringApplication());
//
// register a BeanPostProcessor that loads the property values from the environment into
// @ConfigurationProperties classes
//
applicationContext.addBeanFactoryPostProcessor(
beanFactory -> beanFactory.addBeanPostProcessor(
applicationContext.getBean(PropertyAwareTestContextConfiguration.class).
getConfigurationPropertiesBindingPostProcessor()));
}
}