java - 如何从 IntelliJ IDEA 中的测试类访问静态文件?
问题描述
我对这个试图在 IntelliJ 中加载静态文件的人有类似的问题,但不同之处在于我正在尝试从测试类加载该静态文件并且不清楚如何去做。
我在 IntelliJ 中的项目层次结构如下所示:
projectroot
.idea
src
main
java
net.joeclark.mypackage
MyClass.java
resources
data.txt
test
java
net.joeclark.mypackage
MyClassTest.java
我正在使用 IntelliJ IDEA 社区 2019.1。我想在 MyClassTest.java 中编写一个调用文件中数据的测试data.txt
。该resources
目录被“标记”为“测试资源根”,我试图从 MyClassTest.java 打开文件,如下所示:
@Test
void canDoSomethingWithTheFile() {
String fileName = "data.txt";
try(Stream<String> stream = Files.lines(Paths.get(fileName))) {
// do something with the file
} catch (IOException e) {
e.printStackTrace();
}
}
但是,在 IntelliJ 中运行项目会引发 NoSuchFileException。
我尝试了文件名的变体,例如“ /data.txt
”和“ ./data.txt
”,我尝试将文件放在包目录结构中resources
,即“ resources/net/joeclark/mypackage
”并得到相同的问题。
检查target
目录,我发现静态文件已存放在classes
而不是test-classes
,如下所示:
target
classes
net.joeclark.mypackage
MyClass.class
data.txt
test-classes
net.joeclark.mypackage
MyClassTest.class
我不知道这是否是我的问题的原因。我该如何解决?如何在我的测试类中打开该静态文件?
编辑:不是重复的问题
建议的副本是有帮助的,但是(1)它接受的答案没有回答我的问题或它的问题(最高投票的替代方案更接近标记),并且(2)它没有解决“为什么”发生了什么,或纠正它的最佳实践。
如果允许,我会回答什么
我发现测试似乎使用源文件的“projectroot”工作目录运行,而不是“目标”或输出目录,所以如果我使用路径“src/main/resources/data.txt”我会到达文件。更好地解释为什么会发生这种情况会有所帮助。(即,为什么编译的测试类引用源目录中的文件?)。
我还发现resources
在main
目录中包含不是最佳实践,因为这会导致测试数据文件与 .jar 一起打包。通过移动resources
目录,test
我可以成功运行我的测试(使用“src/test/resources/data.txt”),但资源不会与编译的代码一起打包。
编辑 2:使用 ClassReader 的第二种方式
马克的评论建议使用getClass().getResourceAsStream("/data.txt")
. 这会产生一个 InputStream,但我没有得到任何关于如何将其转换为 Stream 的指导。根据这个答案,我想出了以下方法:
try(Stream<String> stream = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream("/data.txt"))).lines()) {
// do the thing with the file;
} catch (NullPointerException e) { // note, not the same exception type
e.printStackTrace();
}
解决方案
推荐阅读
- ruby - 在 Browserstack 中将会话 ID 更新为测试名称
- c# - 如何使用 C# linq 转换嵌套的 foreach 循环
- php - 路由功能模块与路由功能模块?
- python - 使用 groupby 查找往年信息
- java - 尝试设置 JVM 标志时 Java 运行时崩溃
- jenkins - 詹金斯添加/更新所有工作:应该有默认收件人列表的电子邮件警报
- sql - 通过仅重建您想要的部分树来加速 T-SQL CTE?
- javascript - 如何更改在 React 中动态创建的 div 中的值
- vb.net - 按增量滚动
- angular - Bootstrap 的工具提示需要 Popper.js - Karma Jasmine TypeError