【问题标题】:Access Resources in Unit Tests在单元测试中访问资源
【发布时间】:2014-08-21 09:20:37
【问题描述】:

我正在使用 JUnit 4、Java 8 和 Gradle 1.12。 我有一个需要加载的默认 json 文件。我的项目有src/main/java/(包含项目源)、src/main/resources/(空)、src/test/java/(单元测试源)和src/test/resources/(要加载的json数据文件)目录。 build.gradle 文件位于根目录中。

在我的代码中:

public class UnitTests extends JerseyTest
{
  @Test
  public void test1() throws IOException
  {
    String json = UnitTests.readResource("/testData.json");
    // Do stuff ...
  }

  // ...
  private static String readResource(String resource) throws IOException
  {
    // I had these three lines combined, but separated them to find the null.
    ClassLoader c = UnitTests.class.getClassLoader();
    URL r = c.getSystemResource(resource); // This is returning null. ????
    //URL r = c.getResource(resource); // This had the same issue.
    String fileName = r.getFile();
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName)))
    {
      StringBuffer fileData = new StringBuffer();
      char[] buf = new char[1024];
      int readCount = 0;
      while ((readCount = reader.read(buf)) != -1)
      {
        String readData = String.valueOf(buf, 0, readCount);
        fileData.append(readData);
      }

      return fileData.toString();
    }
  }
}

根据我阅读的内容,这应该可以让我访问资源文件。但是,当我尝试使用 URL 时,会出现空指针异常,因为 getSystemResource() 调用返回 null。

如何访问我的资源文件?

【问题讨论】:

  • 你的类路径中有 /src/test/resources 文件夹吗?
  • 我对此表示怀疑。不过我没有加载课程。

标签: java gradle junit4


【解决方案1】:

资源名称不以斜杠开头,因此您需要去掉它。最好使用UnitTests.getClassLoader().getResourceAsStream("the/resource/name") 读取资源,或者,如果需要File,则使用new File(UnitTests.getClassLoader().getResource("the/resource/name").toURI())

在 Java 8 上,您可以尝试以下方法:

URI uri = UnitTests.class.getClassLoader().getResource("the/resource/name").toURI();
String string = new String(Files.readAllBytes(Paths.get(uri)), Charset.forName("utf-8"));

【讨论】:

  • 问题是斜线。出于某种原因,我阅读的所有示例都有一个前导斜杠。 Java 8 建议有一些错误。这是正确的代码,任何人都可以使用:URI uri = UnitTests.class.getClassLoader().getResource(resource).toURI(); return new String(Files.readAllBytes(Paths.get(uri)), Charset.forName("utf-8"));
  • 要么示例使用Class#getResource 而不是ClassLoader#getResource,要么它们是错误的。修复了 Java 8 代码 sn-p。
【解决方案2】:

我认为您需要 getResource 而不是 getSystemResource。后者用于例如从文件系统中读取文件,其中路径不会根据 jar 指定。

你也可以跳过类加载器:UnitTests.class.getResource("...")

Docs about resources here

编辑:答案here中有一些更详细的cmets。

【讨论】:

  • 我正在使用 getResources,但它产生了同样的错误。
  • 仔细阅读后,我意识到我误解了 getSystemResource 文档。它的参数是根据系统环境的类路径指定的,而不是文件系统根目录,正如我在写上面的答案时所想的那样。为了链接,我将在此处留下答案。
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多