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!