Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring jUnit Testing properties file

I have a jUnit Test that has its own properties file(application-test.properties) and its spring config file(application-core-test.xml).

One of the method uses an object instantiated by spring config and that is a spring component. One of the members in the classes derives its value from application.properties which is our main properties file. While accessing this value through jUnit it is always null. I even tried changing the properties file to point to the actual properties file, but that doesnt seem to work.

Here is how I am accessing the properties file object

@Component @PropertySource("classpath:application.properties") public abstract class A {      @Value("${test.value}")     public String value;      public A(){         SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);     }      public A(String text) {         this();         // do something with text and value.. here is where I run into NPE     }  }  public class B extends A {       //addtnl code      private B() {      }       private B(String text) {          super(text)     } }  @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:META-INF/spring/application-core-test.xml",                              "classpath:META-INF/spring/application-schedule-test.xml"}) @PropertySource("classpath:application-test.properties") public class TestD {      @Value("${value.works}")     public String valueWorks;      @Test     public void testBlah() {              SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);         B b= new B("blah");         //...addtnl code      }     }       
like image 573
Nikhil Das Nomula Avatar asked Oct 06 '15 15:10

Nikhil Das Nomula


People also ask

How do I read properties file in Spring boot?

You can use @TestPropertySource annotation in your test class. Just annotate @TestPropertySource("classpath:config/mailing. properties") on your test class. You should be able to read out the property for example with the @Value annotation.

Where does Spring boot look for properties file in a test?

properties file in the classpath (src/main/resources/application. properties).


2 Answers

Firstly, application.properties in the @PropertySource should read application-test.properties if that's what the file is named (matching these things up matters):

@PropertySource("classpath:application-test.properties ") 

That file should be under your /src/test/resources classpath (at the root).

I don't understand why you'd specify a dependency hard coded to a file called application-test.properties. Is that component only to be used in the test environment?

The normal thing to do is to have property files with the same name on different classpaths. You load one or the other depending on whether you are running your tests or not.

In a typically laid out application, you'd have:

src/test/resources/application.properties 

and

src/main/resources/application.properties 

And then inject it like this:

@PropertySource("classpath:application.properties") 

The even better thing to do would be to expose that property file as a bean in your spring context and then inject that bean into any component that needs it. This way your code is not littered with references to application.properties and you can use anything you want as a source of properties. Here's an example: how to read properties file in spring project?

like image 150
Robert Moskal Avatar answered Sep 20 '22 11:09

Robert Moskal


As for the testing, you should use from Spring 4.1 which will overwrite the properties defined in other places:

@TestPropertySource("classpath:application-test.properties") 

Test property sources have higher precedence than those loaded from the operating system's environment or Java system properties as well as property sources added by the application like @PropertySource

like image 21
sendon1982 Avatar answered Sep 20 '22 11:09

sendon1982