我在名为allDepartments.json
的子目录中有fixtures
文件,我想从Fixture.java
类访问该目录。
这是我的Fixture.java代码:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public final class Fixture {
private static final String FIXTURES_PATH = "";
private final String fixture;
public Fixture(String fixtureName) throws IOException {
fixture = new String(Files.readAllBytes(Paths.get(FIXTURES_PATH + fixtureName)));
}
public final String getFixture() {
return fixture;
}
}
然而,每当他尝试访问该文件时,我都会得到java.nio.file.NoSuchFileException: allDepartments.json
...
我听说过getResource()
方法并尝试了它的每一种组合,但没有成功。
我需要这个来为我的JUnit测试存储多行字符串。
我该怎么办?
答案 0 :(得分:3)
NIO.2 API无法用于读取有效项目资源的文件,即类路径中存在的文件。
在您的情况下,您有一个Maven项目和您希望在应用程序的单元测试期间读取的资源。首先,这意味着应将此资源放在src/test/resources
下,以便Maven在测试期间将其自动添加到类路径中。其次,这意味着您无法使用Files
实用程序来阅读它。
您需要使用传统的BufferedReader
:
public Fixture(String fixtureName) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(Fixture.class.getResourceAsStream(FIXTURES_PATH + fixtureName)))) {
// do your thing with br.readLine();
}
}
请注意,getResourceAsStream
的路径是相对于当前类还是绝对路径。如果资源位于src/test/resources/folder/allDepartments.json
,则有效路径为/folder/allDepartments.json
。
答案 1 :(得分:1)
将allDepartments.json
添加到项目的.classpath
文件中,java应该可以选择它。
答案 2 :(得分:1)
运行Fixtures.java时,相对路径为
../夹具/ allDepartments.json
尝试使用此路径。
答案 3 :(得分:0)
谢谢大家的帮助和建议。
多亏了你,我能够把事情搞定,所以这就是诀窍(我猜这只适用于Maven项目):
我按照你们的建议将allDepartments.json
文件移动到默认的src/test/resources
文件夹。我甚至不必修改pom.xml
。现在一切正常!
所以现在这是我的项目结构:
最终的Fixture.java代码是:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.stream.Collectors;
public final class Fixture {
private final String fixture;
public Fixture(String fixtureName) throws IOException {
fixture = this.readFile(fixtureName);
}
private String readFile(String fileName) throws IOException {
final InputStream in = this.getClass().getClassLoader().getResource("fixtures/" + fileName).openStream();
final BufferedReader buffer = new BufferedReader(new InputStreamReader(in));
try {
return buffer.lines().collect(Collectors.joining("\n"));
} finally {
buffer.close();
}
}
public final String getFixture() {
return fixture;
}
}