Java 为什么可以';在使用Maven运行Junit测试时,我是否可以访问src/test/resources?

Java 为什么可以';在使用Maven运行Junit测试时,我是否可以访问src/test/resources?,java,junit4,mockito,Java,Junit4,Mockito,我在运行以下代码时遇到问题: configService.setMainConfig("src/test/resources/MainConfig.xml"); 从Junit@Before方法中 这就是Maven构建目标文件夹的方式吗?直接访问MainConfig.xml。src/test/resources目录内容放在类路径的根目录中 更准确地说:src/test/resources的内容被复制到target/test类,因此如果您有以下项目结构: . └── src └── tes

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

configService.setMainConfig("src/test/resources/MainConfig.xml");
从Junit@Before方法中


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

直接访问
MainConfig.xml
src/test/resources
目录内容放在类路径的根目录中

更准确地说:
src/test/resources
的内容被复制到
target/test类
,因此如果您有以下项目结构:

.
└── src
    └── test
        ├── java
        │   └── foo
        │       └── C.java
        └── resources
            ├── a.xml
            └── foo
                └── b.xml
.
└── src
│   └── test
│       ├── java
│       │   └── mypackage
│       │       └── MyClassTest.java
│       └── resources
│           └── image.jpg
└── target
    └── test-classes
            ├── image.jpg
            └── mypackage
                └── MyClassTest.class  
它将产生以下测试类路径内容:

  • /foo/C.class
  • /a.xml
  • /foo/b.xml
要从Java源代码实际访问文件,请使用
getClass().getResource(“/MainConfig.xml”).getFile()
我猜
setMainConfig
需要资源的路径,它将使用类加载器加载,而不是相对文件路径。如果您链接到这个神秘的
configService.setMainConfig
方法的javadoc,将会有所帮助


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

我今天遇到了同样的问题,我找到了一些解决办法

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

.
└── src
    └── test
        ├── java
        │   └── foo
        │       └── C.java
        └── resources
            ├── a.xml
            └── foo
                └── b.xml
.
└── src
│   └── test
│       ├── java
│       │   └── mypackage
│       │       └── MyClassTest.java
│       └── resources
│           └── image.jpg
└── target
    └── test-classes
            ├── image.jpg
            └── mypackage
                └── MyClassTest.class  
什么不起作用:(Java 11 synthax)

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

摘要

这三种解决方案都可以工作,但在我看来,必须放入
src/test/resources/
并不优雅,这就是为什么我更喜欢第二种解决方案(
ClassLoader

资料来源:


感谢您的深思熟虑的回答。您确实正确,该文件可以在/target/test类下看到。我仍然无法从我的代码中引用它。尝试了各种组合:“configService.setMainConfig(“MainConfig.xml”);”configService.setMainConfig(“target/test classes/MainConfig.xml”);'setMainConfig(“classpath:MainConfig.xml”);etc etcTry
getClass().getResource(“/MainConfig.xml”).getFile()
如果您使用Tycho和eclipse插件作为打包类型,请不要忘记在build.properties文件中添加src/test/resources。谢谢,但我在jenkins中运行junit,但它失败了,出于某种原因,src/test/resource中的文件将被复制到/target/classes,而不是/target/test classes。你的逻辑是正确的(见上面的评论),但不幸的是,我仍然无法让它工作
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
var absPath = new File("src/test/resources/image.jpg").getAbsolutePath();
var var anyFileUnderThisPath = new File(absPath).exists(); // true