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

时间:2011-03-29 18:37:29

标签: java eclipse unit-testing resources maven

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

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:9)

一个技巧是将文件放在具有已知名称的资源中,通过类加载器获取此文件的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”方式,我会感到惊讶。

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

试试这个?

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

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

答案 3 :(得分:-1)

  1. 将所需资源放入/src/test/resources/lipsum.pdf
  2. 使用

    找到它的完整路径

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