デバッグ中に私はMockito 1.10を使って何か信じられないほど奇妙なものを見つけました。私は誰かがここで知覚される動作を説明することを望んでいました:なぜMockitoはInputStreamで奇妙な動作をしていますか?
私が次を実行すると、スレッドがハングアップし、テストが返されません。作成されたJavaプロセスのCPUも天文学になります!
@Test(expected = IOException.class)
public void mockitoWeirdness() throws IOException {
final InputStream mis = mock(InputStream.class);
doThrow(IOException.class).when(mis).read();
ByteStreams.copy(mis, new ByteArrayOutputStream());
}
次のように私は手動でこのメソッドをスタブすると、期待にIOExceptionがスローされます。
@Test(expected = IOException.class)
public void nonMockitoExpected() throws IOException {
final InputStream mis = new InputStream() {
@Override
public int read() throws IOException {
throw new IOException();
}
};
ByteStreams.copy(mis, new ByteArrayOutputStream());
}
どのように、なぜこの方法が失敗しているmockitoは素晴らしいだろう理解するすべてのヘルプ。
私は 'ByteStreams.copy'の実装を知りませんが、1バイトを読み込む代わりに' read(byte []) 'を呼び出す' read() 'を呼び出さないかもしれません。 –
' ByteStreams.copy read()の前にInputStreamの何かを呼び出します。私たちがこのクラスのコードを持っていれば、さらに調査するのに非常に役立つでしょう。 – Ray
ByteStreamsは、このためのGoogleGuavaライブラリです。私はあなたがここで正しいと思います。私がクラスをスパイすると、その動作は成功します。これがどのような方法であるかについてもう少し調査します。 –