我有一个与this guy who was trying to load a static file in 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
下的软件包目录结构中,即“ {{1 }}”,并得到相同的问题。
检查resources/net/joeclark/mypackage
目录,我发现静态文件已存放在target
下,而不是classes
下,如您在此处看到的那样:
test-classes
我不知道这是否是我的问题的原因。我该如何解决?如何在测试类中打开该静态文件?
建议的重复项很有帮助,但(1)接受的答案不能回答我的问题或其问题(投票最多的替代方案更接近商标),以及(2)无法解决正在发生的“原因”或解决问题的最佳做法。
我发现测试似乎在 source 文件的工作目录“ projectroot”下运行,而不是“ target”目录或输出目录,因此,如果我使用路径“ src / main / resources / data.txt”我确实到达了文件。更好地解释为什么会发生的原因。 (即,为什么 compiled 测试类引用 source 目录中的文件?)。
我还发现,在 target
classes
net.joeclark.mypackage
MyClass.class
data.txt
test-classes
net.joeclark.mypackage
MyClassTest.class
目录中包含resources
不是最佳实践,因为这会使测试数据文件与.jar打包在一起。通过将main
目录移到resources
下,我可以成功运行测试(使用“ src / test / resources / data.txt”),但是资源不会与已编译的代码打包在一起。 / p>
Mark的评论建议使用test
。这将产生一个InputStream,但是我没有得到有关如何将其转换为Stream的任何指导。利用this answer,我想到了以下可行的方法:
getClass().getResourceAsStream("/data.txt")