在JUnit中获取/src/test/resources目录的路径

2023/05/08

1. 概述

有时在单元测试期间,我们可能需要从类路径中读取文件或将文件传递给被测对象。我们还可能在src/test/resources目录中有一个文件,其中包含WireMock等库可以使用的stub数据。

在本教程中,我们将学习如何读取/src/test/resources目录的路径

2. Maven依赖

首先,我们需要将JUnit 5添加到我们的Maven依赖项中:

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

最新版本的JUnit 5可以在Maven Central上找到。

3. 使用java.io.File

最简单的方法是使用java.io.File类的实例通过调用getAbsolutePath()方法来读取/src/test/resources目录:

@Test
void givenResourcePath_whenReadAbsolutePathWithFile_thenAbsolutePathEndsWithDirectory() {
    String path = "src/test/resources";

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

    LOGGER.debug(absolutePath);
    assertTrue(absolutePath.endsWith("src" + File.separator + "test" + File.separator + "resources"));
}

请注意,此路径是相对于当前工作目录的,即项目目录

让我们看一下在Windows上运行测试时的示例输出:

4. 使用java.nio.file.Path

接下来,我们可以使用Java 7中引入的Path类

首先,我们需要调用静态工厂方法Paths.get()。然后我们将Path转换为File。最后,我们只需要调用getAbsolutePath(),如前面的例子所示:

@Test
void givenResourcePath_whenReadAbsolutePathWithPaths_thenAbsolutePathEndsWithDirectory() {
    Path resourceDirectory = Paths.get("src", "test", "resources");

    String absolutePath = resourceDirectory.toFile().getAbsolutePath();

    LOGGER.debug(absolutePath);
    assertTrue(absolutePath.endsWith("src" + File.separator + "test" + File.separator + "resources"));
}

输出结果与上一个测试相同。

5. 使用ClassLoader

最后,我们还可以使用ClassLoader类:

@Test
void givenResourceFile_whenReadResourceWithClassLoader_thenPathEndWithFilename() {
    String resourceName = "example_resource.txt";

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

    LOGGER.debug(absolutePath);
    assertTrue(absolutePath.endsWith(File.separator + "example_resource.txt"));
}

让我们看一下输出:

D:\workspace\intellij\taketoday-tutorial4j\software.test\junit-5-basics\target\test-classes\example_resource.txt

请注意,这一次,我们有一个junit-5-basics\target\test-classes\example_resource.txt文件。当我们将结果与以前的方法进行比较时,它会有所不同。

这是因为ClassLoader在类路径中查找资源。在Maven中,编译后的类和资源放在/target/目录中。这就是为什么这一次,我们得到的是一个类路径资源的路径。

6. 总结

在这篇简短的文章中,我们讨论了如何在JUnit 5中读取/src/test/resources目录。

根据我们的需要,我们可以使用多种方法来实现我们的目标:File、Paths或ClassLoader类。

与往常一样,所有示例都可以在我们的GitHub项目中找到。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章