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

时间:2011-09-30 16:29:38

标签: java junit4 mockito

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

configService.setMainConfig("src/test/resources/MainConfig.xml");

来自Junit @Before方法。

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

3 个答案:

答案 0 :(得分:66)

直接访问MainConfig.xmlsrc/test/resources目录内容放在CLASSPATH的根目录中。

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

.
└── src
    └── test
        ├── java
        │   └── foo
        │       └── C.java
        └── resources
            ├── a.xml
            └── foo
                └── b.xml

将产生以下测试CLASSPATH内容:

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

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

答案 1 :(得分:3)

我猜setMainConfig期望资源的路径,它将使用ClassLoader加载,而不是相对文件路径。如果你链接到这个神秘的configService.setMainConfig方法的javadoc,它会有所帮助。

如果我的猜测是正确的,那么路径应该只是MainConfig.xml。 Mave将src/test/resources的内容复制到target/test-classes(IIRC)文件夹。此test-classes文件夹位于单元测试的类路径中。

答案 2 :(得分:3)

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

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

.
└── src
│   └── test
│       ├── java
│       │   └── mypackage
│       │       └── MyClassTest.java
│       └── resources
│           └── image.jpg
└── target
    └── test-classes
            ├── image.jpg
            └── mypackage
                └── MyClassTest.class  

什么不起作用:(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

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

解决方案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

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

解决方案2:ClassLoader

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

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

解决方案3:文件(适用于无效示例)

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

在采用绝对路径并将src/test/resources/作为前缀之后,哪个也可以工作。

摘要

所有这三种解决方案都有效,但是我认为必须放src/test/resources/并不优雅,这就是为什么我更喜欢第二种解决方案(ClassLoader)的原因。

来源: