Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to populate yml property file in JUnit 5 test without build spring context

Let’s say that I have a service that took a property file from the application.yml file:

orders:
  batch-size: 2

and read by @Value annotation:

@Value("${orders.batch-size}")
private String ordersBatchSize;

to conduct data partitioning.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I am writing the JUnit tests and would like to get the above property from the application.yml file which is in the resources. Problem is that the JUnit test property is always null. My JUnit class test is annotated with @ExtendWith(MockitoExtension.class).
I don’t want to build Spring context by annotating the class with @SpringBootTest.
According to this, I need to populate the property file but I tried probably everything without a desirable result.

Attempts so far:

ReflectionTestUtils.setField(classUnderTest, "field", "value")

or

Yaml yaml = new Yaml();
InputStream inputStream =this.getClass().getClassLoader().getResourceAsStream("application.yml");
yaml.load(inputStream);

or

Properties properties = new Properties();
properties.load(new FileReader("/application.properties"));

or

System.setProperty("orders.batch-size", "2");

or:

public static Properties fetchProperties() {
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.yml");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
          // exception logic
        }
    return properties;
}

or hints from this topic but it didn’t bring a desirable solution.

I will be grateful for suggestions on how to fix this issue. Cheers!

>Solution :

First of all, the type should be an integer.

@Value("${orders.batch-size}")
private Integer ordersBatchSize;

Then using the reflections utils is quite a common approach. Note the field name has to match.

ReflectionTestUtils.setField(classUnderTest, "ordersBatchSize", 100)

A better way is using a setter (if available) in the method annotated with @BeforeEach.

@BeforeEach
public void beforeEach() {
    classUnderTest.setOrdersBatchSize(100);
}

Finally, the best way is to define application.yml in the test/resources folder which Spring Boot takes with priority for sake of testing:

orders.batch-size=100
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading