首先考虑使用
IOUtils.closeQuietly(),它会将未经测试的代码(可能是重复代码)减少为:
try {
f = new BufferedInputStream(new FileInputStream(source));
f.read(buffer);
} finally {
IoUtils.closeQuietly(f);
}
现在变得艰难. “正确”的方法是将BufferedInputStream的创建外部化到另一个类中并注入mock.有了一个模拟,你可以验证是否调用了适当的close()方法.
@ JeffFoster的答案非常接近我的意思,但是我会推荐组合而不是继承(以更多的代码为代价):
try {
f = fileSystem.open(source);
f.read(buffer);
} finally {
IoUtils.closeQuietly(f);
}
其中fileSystem是FileSystem接口的一个实例,其中简单的实际实现在生产代码中注入或模拟用于测试.
interface FileSystem {
InputStream open(String file);
}
外部化文件打开的另一个好处是,如果您决定删除缓冲或添加加密,则只需要修改一个位置.
使用该接口,您可以使用模拟实例化测试代码(使用Mockito):
//given
FileSystem fileSystemMock = mock(FileSystem.class);
InputStream streamMock = mock(InputStream.class);
given(fileSystemMock.open("file.txt")).willReturn(streamMock);
//when
//your code
//then
verify(streamMock).close();