【问题标题】:Get filename path from test/resources in junit test从 junit test 中的 test/resources 获取文件名路径
【发布时间】:2014-04-20 10:32:46
【问题描述】:
我想为我的 CsvReader 适配器读取 Junit 测试。它将文件名作为构造函数中的参数。我已经在 src/test/resources 中放置了一个文件 test.txt 用于测试目的,但是我不知道如何从测试中获取这个文件。当我只传递文件名时,我得到 FileNotFoundException。
我已经阅读了有关 class.getClassLoader().getResourceAsStream(name) 的方法,但是我不能将 InputStream 而不是文件名传递给构造函数,因为我需要在读取文件后多次重新打开文件才能回到文件的开头所有的。不幸的是,第三方 CSVReaders 没有将 RandomAccessFile 作为参数,我也没有发明任何更好的解决方案。所以总有办法从 Junit Test 中获取 test/resources/file.txt 的路径吗?
【问题讨论】:
标签:
java
file
testing
junit
filenames
【解决方案1】:
在运行时,该文件不在测试/资源中。您的构建系统/IDE 将把它放在 一个 Jar 中,或者放在你的 classes/ 目录中的某个地方。无论哪种方式,它都只能通过类路径访问; getResourceAsStream() 将其抽象出来,所以这就是您应该使用的。
如果您真的需要一个文件名(即,如果这是您的课程工作方式的一个不可避免的方面*),那么您应该考虑使用 JUnit 的 @TemporaryFolder rule;让您的测试设置将资源文件的内容复制到一个临时文件中,然后将其名称传递给您的构造函数。
* 这听起来像是一个设计缺陷,您应该考虑重写您的类以使用抽象。
【解决方案2】:
我知道这是一个老问题并且有答案,但我理解当您想要使用文件路径时,尤其是在通常不打包并交付给用户的 JUnit 中工作时。
因此,这是我使用 Java 8 获取 JUnit 路径的方法。
URL resource = this.getClass().getClassLoader().getResource("Name_of_file.csv");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();