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

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

module \ src \ main - java - resources \ test - java - resources 

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

 File file = new File("src/test/resources"); file.list(); 

(我实际上使用的是FilenameFilter ,但我正在尝试简化。)

在使用调试器进行unit testing后,问题结果是我构建的文件指向/path/to/workspace/myproj/src/test/resources ,而实际文件位于/path/to/workspace/myproj/modulename/src/test/resources (这是一个Maven多模块项目)。 显然,从命令行运行mvn test时这不是问题。

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

一个技巧是将文件放在具有已知名称的资源中,通过类加载器获取此文件的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(); 

然后,您可以访问您正在寻找的目录。

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

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

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

试试这个?

1)将测试数据文件放入与测试类相同的包结构中。 也就是说,如果你在src / test / java / com / fruits中有一个名为Apple的测试类,那么测试数据文件将在src / resources / java / com / fruits中。

2)编译文件时,类和数据文件都应该在target / test-classes / com / fruits中。 如果是这种情况,在您的代码中,您可以通过这种方式获取文件“this.getClass()。getResourceAsStream(”myFile“)”

  1. 将所需资源放入/src/test/resources/lipsum.pdf
  2. 找到它的完整路径使用

    String fileName = ClassLoader.getSystemResource(“lipsum.pdf”)。getFile();