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.10.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 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!