bkeyser5280
bkeyser5280

Reputation: 63

Spring Boot ConfigurationProperties fail to initialize for integration testing

Using gradle (3.4.1) with an integrationTest configuration, the tests using the ConfigurationProperties of Spring Boot (1.5.1.RELEASE) is failing to initialize even though the application initializes correctly (./gradlew bootRun). The class annotated with ConfigurationProperties is similar to the following

@Component
@ConfigurationProperties(prefix = "foo")
@Validated
public class AppConfiguration {
    @NonNull
    private URL serviceUrl;
    ...

The configuration file does have getters and setters. The error that is generated is similar to the following

java.lang.IllegalStateException: Failed to load ApplicationContext
....
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AppConfiguration': Could not bind properties to AppConfiguration
....
Caused by: org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder$RelaxedBeanPropertyBindingResult
Field error in object 'foo' on field 'serviceUrl': rejected value [null]; codes ...

The configuration class of the integration test is annotated as follows

@Configuration
@ComponentScan(...)
@EnableConfigurationProperties
@EnableIntegration
public static class ContextConfiguration {}

Upvotes: 0

Views: 1892

Answers (1)

bkeyser5280
bkeyser5280

Reputation: 63

The test class had the following annotations

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ReleaseTest {
...

After looking at the Spring Boot code for the ConfigurationPropertiesBindingPostProcessor#postProcessBeforeInitialization() it suggested that the property source was not being discovered. Adding the org.springframework.boot:spring-boot-starter-test artifact as a compile-time dependency and modifying the context configuration of the test class to

@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)

the AppConfiguration class was initialized properly using a YAML-based properties file.

An alternative is to add

@TestPropertySource("classpath:/application.properties")

This approach doesn't require the spring-boot-starter-test dependency and requires that a "traditional" properties file is used (a YAML file will not work with this approach).

Upvotes: 1

Related Questions