Generic Top

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE

1. Overview

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

In this tutorial, we’ll show 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.4.2</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 see 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. In the end, 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’d get the same output as in the previous example:

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

4. Using ClassLoader

Finally, 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"));

And, 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

To sum up, in this quick tutorial we’ve discussed how to read a /src/test/resources directory in JUnit 5.

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

As always, you can find all of our examples on our GitHub project!

Generic bottom

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE

Leave a Reply

avatar
  Subscribe  
Notify of