我想阅读CsvReader适配器的Junit测试。它在构造函数中使用filename作为参数。出于测试目的,我在src/test/resources中放置了一个文件test.txt,但我不知道如何从测试中获取该文件。当我刚传递文件名时,我会得到FileNotFoundException。我读过class.getClassLoader().getResourceAsStream(name)的方法,但我不能将InputStream而不是文件名传递给构造函数,因为我需要多次重新打开文件,才能在读取整个文件后回到文件的开头。不幸的是,第三方CSVReaders并没有将RandomAccessFile作为论据,我也没有发明任何更好的解决方案。那么,从Junit test中获取test/resources/file.txt的路径总是有工作方法吗?
在运行时,该文件不存在于测试/资源中。您的构建系统/IDE会将其放在的Jar中,或者放在类/目录中的某个位置。无论哪种方式,它都只能通过类路径访问;getResourceAsStream()
将其抽象化,所以这就是您应该使用的。
如果真的需要一个文件名(即,如果这是类工作方式的一个不可避免的方面*),那么您应该考虑使用JUnit的@TemporaryFolder
规则;让测试设置将资源文件的内容复制到一个临时文件中,然后将该文件的名称传递给构造函数。
*这听起来像是一个设计缺陷,您应该考虑重写类以使用抽象
我知道这是一个老问题,也有答案,但我理解您何时想要使用文件路径,尤其是在JUnit中工作时,通常不会打包并交付给用户。
因此,以下是我使用Java8获取JUnit路径的方法。
URL resource = this.getClass().getClassLoader().getResource("Name_of_file.csv");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();