私は本質的に私が永久にブロックする入力ストリームが必要なところでいくつかのユニットテストをしています。今、私はすべての原因、それは時間の一部を動作しますが、出力ストリームは(私がテストしてる何)が終了する前に、他の回の入力ストリームが読み込まれる入力ストリームを構築するテストのために常に入力ストリームをブロックしていますか?
InputStream in = new ByteArrayInputStream("".getBytes());
これを使用しています一種の混乱。
本来、この入力ストリームは、読み込み時に永久にブロックする必要があります。私が考えることができる唯一の解決策は、他のスレッドが終了するように大規模なバッファでInputStreamをセットアップすることですが、それは本当にハックと脆い解決策です。私はmockitoを持っているが、私はそれを非常に新しいと私は離れて何かを嘲笑せずに読んで嘲笑で離れて得ることができるかどうかわからない。
もっと良い解決方法を知っている人はいますか?
EDIT:
これが私の新しい試みです。ほとんどの場合は動作しますが、入力スレッドが早期に終了すると出力スレッドが停止する(その動作は意図的です)。どうしてこれが失敗するのか分かりません。
これは、わかりやすくするためにTestNGでの一般的なテストです。
protected CountDownLatch inputLatch;
@BeforeMethod
public void botSetup() throws Exception {
//Setup streams for bot
PipedOutputStream out = new PipedOutputStream();
//Create an input stream that we'll kill later
inputLatch = new CountDownLatch(1);
in = new AutoCloseInputStream(new ByteArrayInputStream("".getBytes()) {
@Override
public synchronized int read() {
try {
//Block until were killed
inputLatch.await();
} catch (InterruptedException ex) {
//Wrap in an RuntimeException so whatever was using this fails
throw new RuntimeException("Interrupted while waiting for input", ex);
}
//No more input
return -1;
}
});
Socket socket = mock(Socket.class);
when(socket.getInputStream()).thenReturn(in);
when(socket.getOutputStream()).thenReturn(out);
//Setup ability to read from bots output
botOut = new BufferedReader(new InputStreamReader(new PipedInputStream(out)));
...
}
@AfterMethod
public void cleanUp() {
inputLatch.countDown();
bot.dispose();
}
テストでは、適切な行数を取得するためにbotOutからreadLine()
を使用します。しかし、問題は、出力スレッドが終了すると、readLine()
が永久にブロックされ、TestNGがハングアップするということです。私は混在した結果でタイムアウトを試しました。ほとんどの場合は動作しますが、他のテストでは通常よりも少し時間がかかりました。
私の唯一の選択肢は、この種の作業にストリームを使用しないことです。出力スレッドは出力キューに依存しているので、そのスレッドを実行できます。しかし問題は、ストリームに書き込むことを実際にテストしているわけではなく、送られる予定のものだけで、私は気になりません。
私は、BufferedInputStreamにByteArrayInputStreamをラップしてから、CountDownLatchを待つために 'read()'をオーバーロードしました。 @AfterMethodでのみクリーンアップしても、入力スレッドはまだランダムに死んでいるようです。すべてのIOクラスは 'read()'に依存してデータを取得しますか?私は失敗したテストの数が減っているが、問題は依然として続くと言います。 – TheLQ
read()オーバーロードメソッドをすべてオーバーライドしましたか? – SJuan76
@SJuanちょうど 'read()'、他の読み込みオーバーロードは 'read()'に依存していると思いました。 – TheLQ