为什么我不能在使用Maven的Junit测试运行中访问src/test/resources?

Mic*_*l W 45 java junit4 mockito

我在运行以下代码时遇到问题:

configService.setMainConfig("src/test/resources/MainConfig.xml");
Run Code Online (Sandbox Code Playgroud)

来自Junit @Before方法.

这是Maven构建其目标文件夹的方式吗?

Tom*_*icz 66

MainConfig.xml直接访问.该src/test/resources目录内容被放置在你的CLASSPATH的根.

更确切地说:内容src/test/resources被复制到target/test-classes,所以如果你有以下项目结构:

.
??? src
    ??? test
        ??? java
        ?   ??? foo
        ?       ??? C.java
        ??? resources
            ??? a.xml
            ??? foo
                ??? b.xml
Run Code Online (Sandbox Code Playgroud)

它将导致以下测试CLASSPATH内容:

  • /foo/C.class
  • /a.xml
  • /foo/b.xml

要从Java源实际访问文件,请使用 getClass().getResource("/MainConfig.xml").getFile().

  • 试试`getClass().getResource("/ MainConfig.xml").getFile()` (37认同)

Key*_*r00 5

我今天遇到了同样的问题,我找到了一些解决方案。

首先,这是我的文件结构:

.
??? src
?   ??? test
?       ??? java
?       ?   ??? mypackage
?       ?       ??? MyClassTest.java
?       ??? resources
?           ??? image.jpg
??? target
    ??? test-classes
            ??? image.jpg
            ??? mypackage
                ??? MyClassTest.class  
Run Code Online (Sandbox Code Playgroud)

什么不起作用:(Java 11 synthax)

var imgFile = new File("image.jpg"); // I was expecting that Junit could find the file.
var absPath = file.getAbsolutePath(); // /home/<user>/../<project-root>/image.jpg
var anyFileUnderThisPath = file.exists(); // false
Run Code Online (Sandbox Code Playgroud)

我们可以注意到的是,绝对路径根本没有指向我的图像!但是如果我在项目根目录下有一个图像,那么它就会起作用。

解决方案 1:路径(在 Java 7 中引入)

var relPath = Paths.get("src", "test", "resources", "image.jpg"); // src/test/resources/image.jgp
var absPath = relPath.toFile().getAbsolutePath(); // /home/<user>/../<project-root>/src/test/resources/image.jpg
var anyFileUnderThisPath = new File(absPath).exists(); // true
Run Code Online (Sandbox Code Playgroud)

正如我们所见,它指向正确的文件。

解决方案 2:类加载器

var classLoader = getClass().getClassLoader();
var url = classLoader.getResource("image.jpg"); // file:/home/<user>/../<project-root>/target/test-classes/image.jpg
var file = new File(url.getFile()); // /home/<user>/../<project-root>/target/test-classes/image.jpg
var anyFileUnderThisPath = file.exists(); // true
Run Code Online (Sandbox Code Playgroud)

请注意,现在在目标目录下搜索文件!它有效。

解决方案 3:文件(非工作示例的改编)

var absPath = new File("src/test/resources/image.jpg").getAbsolutePath();
var var anyFileUnderThisPath = new File(absPath).exists(); // true
Run Code Online (Sandbox Code Playgroud)

在采用绝对路径并src/test/resources/作为前缀后也有效。

概括

所有三个解决方案都有效,但不得不说src/test/resources/,在我看来,这并不优雅,这就是为什么我更喜欢第二个解决方案 ( ClassLoader)。

资料来源: