我应该如何在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“)”
- 将所需资源放入
/src/test/resources/lipsum.pdf
-
找到它的完整路径使用
String fileName = ClassLoader.getSystemResource(“lipsum.pdf”)。getFile();
- 在Eclipse调试器中,哪些更改可以“热代码替换”到正在运行的JVM中?
- Java中的JSON和generics – 类型安全警告
- 无法执行maven-compiler-plugin:3.6.1:使用java 9时的testCompile
- 在Eclipse中更改未处理的exception自动生成的catch代码?
- Eclipse环绕着引号和其他块
- Eclipse 2018-09使用Java 11插件进入无限构建循环:ClosedFileSystemException
- 使用Maven和Eclipse的Java Dynamic Web项目
- 如何找到运行Java程序的时间?
- 使用Eclipse将清单添加到JAR时,标题字段名称无效