12
votes

I am trying to unit test the spring-boot application using junit. I have placed the application-test.properties under src/test/resources. I have a ApplicationConfiguration Class which reads the application.properties.

My test class looks like this

@RunWith(SpringRunner.class)
@SpringBootTest(classes=ApplicationConfiguration.class)
@TestPropertySource(locations = "classpath:application-test.properties")
@ActiveProfiles("test")
   public class TestBuilders {
      @Autowired
      private ApplicationConfiguration properties;

When I try to read the properties, it is always null.

My ApplicationConfiguration Class looks something like this

@Configuration
@ConfigurationProperties
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource(value="file:config.properties", ignoreResourceNotFound = 
        true)})
public class ApplicationConfiguration{
    private xxxxx;
    private yyyyy;

I tried all possible ways that I found on google.. No luck. Please help! Thanks in Advance.

1
can you show this class ApplicationConfigurationpvpkiran
I just edited my question to add ApplicationConfiguration.. When I run the application it is picking up the properties. problem is only when i run the test cases.FunWithJava
is the properties object null or xxxxx and yyyyy is null?pvpkiran
Did you create this project with the spring-boot initialiser?pandaadb
@pvpkiran properties object is not null... only the fields are nullFunWithJava

1 Answers

29
votes

The issue is you don't have @EnableConfigurationProperties on your test class.
When you load the application it start from main class(one which has @SpringBootApplication) where you might have @EnableConfigurationProperties and hence it works when you start the application.
Whereas when you are running the Test with only ApplicationConfiguration class as you have specified here

@SpringBootTest(classes=ApplicationConfiguration.class)

Spring doesn't know that it has to Enable Configuration Properties and hence the fields are not injecting and hence null. But spring is reading your application-test.properties file. This can be confirmed by just injecting the value directly in your test class

@Value("${xxxxx}")
private String xxxxx;

Here the value is injected. But to inject into a class with ConfigurationProperties you need to enable it using @EnableConfigurationProperties

Put @EnableConfigurationProperties on your test class and everythhing works fine.