首页 > 解决方案 > 如何从 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”我会到达文件。更好地解释为什么会发生这种情况会有所帮助。(即,为什么编译的测试类引用目录中的文件?)。

我还发现resourcesmain目录中包含不是最佳实践,因为这会导致测试数据文件与 .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();
    }

标签: javaunit-testingintellij-ideastatic-files

解决方案


推荐阅读