close() メソッドが呼び出されたかどうかを確認するには、Mockito.spy() を使用して、呼び出しを記憶できるプロキシ オブジェクトを作成します。Spy は、基礎となる InputStream へのすべての呼び出しを委譲し、何が起こったかを記憶するだけです。
InputStream inputStreamSpy = Mockito.spy(inputStream);
// a code that is expected to close your stream goes here ...
Mockito.verify(inputStreamSpy).close();
実際、これは InputStream のインスタンスを注入する際の問題を解決しません。ストリームを開くことができるある種のファクトリが必要なようで、ユニットテストでそのファクトリをモックできます。このファクトリを FileSystem と呼びましょう:
public class FileSystem {
public FileInputStream newFileInputStream(File file) {
return new FileInputStream(file);
}
}
これで、FileSystem のインスタンスを注入できるようになり、run メソッドが実行される前にリソースを使用しなくなります。
public void run() {
InputStream inputStream = null;
try {
inputStream = fileSystem.newFileInputStream(file);
//more stuff here
}
catch (Exception e) {
//simplified for reading
}
finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {}
}
}
}
@Test
public void runShouldCloseInputStream() {
InputStream inputStream = ...
InputStream inputStreamSpy = Mockito.spy(inputStream);
FileSystem fileSystemMock = Mockito.mock(FileSystem.class);
when(mockFileSystem.newFileInputStream(Mockito.any(File.class)))
.thenReturn(inputStreamSpy);
MyRunnable instance = new MyRunnable(mockFileSystem);
instance.run();
verify(inputStreamSpy).close();
}
Spy は聞くだけでなく、通常のモックと同じように、Mockito.when() を使用して動作を変更するように教えることができます。