如果在Test方法启动之前文件不存在,为什么getResourceAsStream()返回null?

时间:2019-06-03 08:03:18

标签: java unit-testing junit assertj

在将其标记为重复项之前,请先阅读问题!

我有一个JUnit测试,它测试将结果写入file的方法。要检查结果,我想读取结果文件并检查其内容。

问题在于,当测试开始之前结果文件不存在时,方法getResourceAsStream()返回null

我的测试代码如下:

@Inject
private ObjectToTest obj

@Test
public void testMethod() throws Exception {
    // Do some setup (inject mocks, set properties of obj, ...)

    obj.method(); // <-- Creates result.txt
    Mockito.verify(obj).method();

    // Thread.sleep(1000); <-- I have tried to use this to wait some time for the result, but it did not work

    // This part is null on the first run of the test
    // When I run the test the second time, the file does already exist and it returns the right InputStream for the File
    InputStream resultInp = this.getClass().getResourceAsStream("/test-out/result.txt");

    String resultStr = IOUtils.toString(resultInp, "UTF-8");

    assertThat(resultStr).isNotNull();
    assertThat(resultStr.split("\n")).hasSize(5);
}

有什么解释为什么会发生这种情况,或者必须对代码的另一部分做些什么?

我在StackOverflow上没有发现与此问题有关的任何内容,但是如果我错了,请引导我到正确的帖子。

1 个答案:

答案 0 :(得分:3)

getResourceAsStream()方法使用类加载器缓存的目录/索引信息返回类路径上资源的流。如果在将类路径缓存后将资源添加到类路径的某个目录树或归档中,则类加载器可能不会“看到”它 1

这很有可能就是您的测试代码中发生的事情。

Java应用程序不应尝试将类加载器资源视为通用文件系统。而是使用FilePath表示文件,并使用FileInputStream或类似名称打开文件。


1-实际行为似乎未在ClassLoader等的javadocs中指定。我的描述是基于观察到的/报告的某些Java实现的行为。