如何从IntelliJ IDEA中的测试类访问静态文件?

时间:2019-06-27 15:12:05

标签: java unit-testing intellij-idea static-files

我有一个与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>

编辑2:使用ClassReader的第二种方法

Mark的评论建议使用test。这将产生一个InputStream,但是我没有得到有关如何将其转换为Stream的任何指导。利用this answer,我想到了以下可行的方法:

getClass().getResourceAsStream("/data.txt")

0 个答案:

没有答案