我正在使用Maven并在静态方法上运行JUnit测试,该方法尝试使用以下方式读取文件:
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename);
然后使用new InputStreamReader(is)
在另一个电话中用作读者。当filename
只是文件名(例如file.csv
)但filename
是相对路径(例如src/test/resources/file.csv
),is
最终为{{{ 1}}。
我需要它来处理相对路径,因为我通过JUnit运行测试套件,查找具有相对路径的资源,这些测试来自我无法控制变更的JAR(即我实现了测试套件使用自己的资源调用自己的测试的外观实现类 - 它们不受我的控制。)
这种方法是否有办法使用相对路径,或者我可以在我的类路径上找到测试所需的那些资源?
答案 0 :(得分:1)
在maven中运行测试,src/test/resources/
(默认情况下)“映射”到类(加载程序)路径的 root ,因此在您的情况下file.csv
是更正src/test/resources/file.csv
的绝对路径。
要成功加载"src/test/resources/file.csv"
(资源),您应该将此文件(物理上)可用:src/test/resources/src/test/resources/file.csv
或src/main/java
(也将映射到cp root)。 。/src/test/resources/file.csv
答案 1 :(得分:0)
在您的情况下,is
最终为空,因为在执行资源查找时,resources
目录是入口点,因此完整路径应为test/resources/src/test/resources/file.csv
或{{ 1}}取决于你如何运行测试。
实现目标的唯一可靠方法是手动关注正确性。也许是这样的:
test/resources/src/test/resources/file.csv
也许你必须根据你的案例的具体情况(可能的嵌套指令的帐户等)编写它,但我真的认为,鉴于你的输入可能是任意性质的,这将不会变得更简单。
答案 2 :(得分:0)
我在博客上(西班牙文)
http://lacuevadeyogui.blogspot.com/2015/04/diferencia-entre-uri-y-url.html
src / test / resources
中对文件的引用问题试试这个
URL url = getClass().getClassLoader().getResource("file.csv");
File f;
try {
f = new File(url.toURI());
} catch (URISyntaxException e) {
f = new File(url.getPath());
}
最后,将文件转换为inputStream。