Generic Top

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

Sometimes during unit testing, we might need to read a file from the classpath or pass a file to an object under test. We might also have a file in src/test/resources with data for stubs that could be used by libraries like WireMock.

In this tutorial, we'll learn how to read the path of the /src/test/resources directory.

2. Maven Dependencies

First, we'll need to add JUnit 5 to our Maven dependencies:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.8.1</version>
</dependency>

We can find the latest version of JUnit 5 on Maven Central.

2. Using java.io.File

The simplest approach uses an instance of the java.io.File class to read the /src/test/resources directory by calling the getAbsolutePath() method:

String path = "src/test/resources";

File file = new File(path);
String absolutePath = file.getAbsolutePath();

System.out.println(absolutePath);

assertTrue(absolutePath.endsWith("src/test/resources"));

Note that this path is relative to the current working directory, meaning the project directory.

Let's look at an example output when running the test on macOS:

/Users/user.name/my_projects/tutorials/testing-modules/junit-5-configuration/src/test/resources

3. Using Path

Next, we can use the Path class, which was introduced in Java 7.

First, we need to call a static factory method, Paths.get(). Then we'll convert Path to File. Finally, we just need to call getAbsolutePath(), as in the previous example:

Path resourceDirectory = Paths.get("src","test","resources");
String absolutePath = resourceDirectory.toFile().getAbsolutePath();

System.out.println(absolutePath);
 
Assert.assertTrue(absolutePath.endsWith("src/test/resources"));

And we get the same output as in the previous example too:

/Users/user.name/my_projects/tutorials/testing-modules/junit-5-configuration/src/test/resources

4. Using ClassLoader

Lastly, we can also use a ClassLoader:

String resourceName = "example_resource.txt";

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource(resourceName).getFile());
String absolutePath = file.getAbsolutePath();

System.out.println(absolutePath);

assertTrue(absolutePath.endsWith("/example_resource.txt"));

Let's have a look at the output:

/Users/user.name/my_projects/tutorials/testing-modules/junit-5-configuration/target/test-classes/example_resource.txt

Note that this time, we have a /junit-5-configuration/target/test-classes/example-resource.txt file. It differs when we compare the result to the previous methods.

This is because the ClassLoader looks for the resources on the classpath. In Maven, the compiled classes and resources are put in the /target/ directory. That's why this time, we got a path to a classpath resource.

5. Conclusion

In this brief article, we discussed how to read a /src/test/resources directory in JUnit 5.

Depending on our needs, we can achieve our goal with multiple methods: File, Paths, or ClassLoader classes.

As always, all of the examples are available over on our GitHub project!

Generic bottom

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE
Junit footer banner
Comments are closed on this article!