我应该如何在Maven管理的Java项目中发现测试资源文件?

Cod*_*rer 11 java eclipse resources unit-testing maven

我有一个使用普通Maven结构的项目,例如

module
\ src
  \ main
    - java
    - resources
  \ test
    - java
    - resources
Run Code Online (Sandbox Code Playgroud)

等等test/resources,我想为我正在编写的解析器保留一组测试输入文件,然后通过测试套件运行目录中的所有文件.正如现在所写,测试代码在命令行中运行,但在通过Eclipse JUnit插件运行时失败:

File file = new File("src/test/resources");
file.list();
Run Code Online (Sandbox Code Playgroud)

(我实际上正在使用a FilenameFilter,但我正在尝试简化.)

在使用调试器进行单元测试之后,问题结果是我构建的文件指向/path/to/workspace/myproj/src/test/resources,而实际文件驻留在/path/to/workspace/myproj/modulename/src/test/resources(它是Maven多模块项目).显然,mvn test从命令行运行时这不是问题.

我想我的问题是双重的:一,我做错了吗?我看到很多人使用类加载器来发现资源,就像在这个问题中一样,但是我不想要特定类型的所有资源,只需要测试/资源下的一个目录.二,如果这首先不是一个可怕的想法,我是否有配置错误(例如它"应该"工作)?这是Eclipse的错,Maven问题还是什么?

jk.*_*jk. 10

一个技巧是将文件放在具有已知名称的资源中,通过类加载器获取此文件的URI,然后从此URI构造文件,然后获取父文件,并列出该目录的内容.一种黑客,但它应该工作.

所以代码应该是这样的,但是在test/src/resources中放置一个名为MY_TEST_FILE(或其他)的文件

URL myTestURL = ClassLoader.getSystemResource("MY_TEST_FILE");
File myFile = new File(myTestURL.toURI());
File myTestDir = myFile.getParentFile();
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问您正在查找的目录.

也就是说,如果没有更多的"maven-y"方式,我会感到惊讶.


Xtr*_*ica 5

只是为了完整性,想要指出获得这个的方法,而不必抓住当前的实例ClassLoader,使用ClassLoader#getSystemResource.此示例无需将文件放在顶部即可完成工作.

//Obtains the folder of /src/test/resources
URL url = ClassLoader.getSystemResource("");
File folder = new File(url.toURI());
//List contents...
Run Code Online (Sandbox Code Playgroud)