在将其标记为重复项之前,请先阅读问题!
我有一个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上没有发现与此问题有关的任何内容,但是如果我错了,请引导我到正确的帖子。
答案 0 :(得分:3)
getResourceAsStream()
方法使用类加载器缓存的目录/索引信息返回类路径上资源的流。如果在将类路径缓存后将资源添加到类路径的某个目录树或归档中,则类加载器可能不会“看到”它 1 。
这很有可能就是您的测试代码中发生的事情。
Java应用程序不应尝试将类加载器资源视为通用文件系统。而是使用File
或Path
表示文件,并使用FileInputStream
或类似名称打开文件。
1-实际行为似乎未在ClassLoader
等的javadocs中指定。我的描述是基于观察到的/报告的某些Java实现的行为。