我正在使用JUnit对我的应用程序进行一些自动化测试,测试位于我的JUnit类包中名为tests的文件夹中。 截至目前,我使用以下方法访问文件:
File file = new File(MyClass.class.getResource("../path/to/tests/" + name).toURI());
有更清洁(更好)的方法吗?
由于
答案 0 :(得分:3)
如果您想使用类加载器加载测试数据,则无法使用File
。 File
实例表示文件系统中的路径。该类从文件系统,jar文件,zip文件或其他地方加载文件。因此,类加载器不允许您访问文件,而是访问资源。
使用MyClass.class.getResourceAsStream("/the/absolute/path.txt")
加载path.txt文件的内容作为输入流。此文件必须位于类路径中的任何位置:path.txt是在文件系统中还是在jar中,只要在类路径中找到它就无关紧要,只需在包the.absolute
中找到。因此,如果您的数据文件位于测试文件夹中,该文件夹位于测试的sources目录下,则使用的路径应为/tests/data.txt
。请注意,这是因为Eclipse会自动“编译”非Java文件的文件,只需将它们复制到输出目录(传统的bin或类),并且在运行测试时该目录位于类路径中。
如果要将此数据作为文本而不是字节加载,只需使用InputStream
包裹InputStreamReader
。
答案 1 :(得分:0)
我确保它们在类路径中,然后使用
MyClass.class.getResourceAsStream("../path/to/tests/" + name);
但是,我不确定它会好得多。您对现在使用的内容有何看法?
这是因为/当资源文件在类路径中时。当它在Eclipse或Intellij的源路径中时,这是免费的。如果你正在使用Hudson或类似的东西进行自动化测试,你需要确保你的构建过程(Ant,Maven,shell脚本等等)也将它们放在类路径中。
答案 2 :(得分:0)
更好的方法是使用URL中的方法getFile(),如下所示:
File file = new File(MyClass.class.getResource("../path/to/tests/" + name).getFile());
答案 3 :(得分:0)
您的数据会更适合您的/ tests /文件夹。它会避免你使用从MyClass开始的相对路径,并且更合乎逻辑。此外,您可以为我的类提供一个文件参数来加载数据文件。然后用生产数据和测试数据调用它。
此致 斯特凡