如何加载相对于类包的文件?

时间:2016-01-15 13:37:33

标签: java maven unit-testing junit junit4

我在名为allDepartments.json的子目录中有fixtures文件,我想从Fixture.java类访问该目录。

enter image description here

这是我的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测试存储多行字符串。

我该怎么办?

4 个答案:

答案 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应该可以选择它。

如果您想了解how to add a file to class path from eclipse

,请参阅此主题

答案 2 :(得分:1)

运行Fixtures.java时,相对路径为

  

../夹具/ allDepartments.json

尝试使用此路径。

答案 3 :(得分:0)

谢谢大家的帮助和建议。

多亏了你,我能够把事情搞定,所以这就是诀窍(我猜这只适用于Maven项目):

我按照你们的建议将allDepartments.json文件移动到默认的src/test/resources文件夹。我甚至不必修改pom.xml。现在一切正常!

所以现在这是我的项目结构:

enter image description here

最终的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;
    }
}