我有一个使用普通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问题还是什么?
答案 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)
/src/test/resources/lipsum.pdf
使用
找到它的完整路径String fileName = ClassLoader.getSystemResource(“lipsum.pdf”)。getFile();