ステファン・ビルクナーの答えは、私がこれを解決できるようにする必要があるという方向性を私に与えました。これを解決するために使用したコードを以下に投稿しました。
解決済みのテスト:Birknerのバージョン(推奨)
解決済みのテスト:パイプバージョン
変更されたソース:
理由: Birknerのライブラリでは、元々ルールを使用してインスタンス化したのと同じ量の入力しか読み取ることができません。エンドポイントに繰り返し書き込む場合は、パイプハックを使用してこれを行うことができますが、大した違いはありません。関数が実際に実行されている間は、パイプを介して入力に書き込むことができないため、 Birknerのバージョンを使用するのもよいでしょうが、彼の@Ruleはより簡潔です。
説明:パイプハックとBirknerのコードの両方で、テスト対象のクライアントで、System.inから読み取るオブジェクトを作成するための複数の呼び出しにより、最初のオブジェクトがパイプまたはへの接続を開くと、ブロッキングの問題が発生します。 System.in、他の人はできません。これがBirknerのコードに正確に当てはまる理由はわかりませんが、Pipeを使用すると、オブジェクトに対して1つのストリームしか開くことができないためだと思います。最初のバッファリングされたリーダーでcloseを呼び出し、テストから呼び出した後にクライアントコードでSystem.inを再度開こうとすると、ライター側のパイプが閉じられているため、2回目の開こうは失敗することに注意してください。同じように。
解決:これを解決する簡単な方法です。実際のプロジェクトのソースを変更する必要があるため、おそらく最善ではありませんが、恐ろしい方法ではありません(まだ)。したがって、実際のプロジェクトのソースに複数のBufferedReaderを作成する代わりに、バッファリングされたリーダーを作成し、同じリーダー参照を渡すか、クラスのプライベート変数にします。静的に宣言する必要がある場合は、静的コンテキストで初期化しないでください。初期化すると、テストの実行時に、リーダーがクライアントで初期化された後にSystem.setInが呼び出されます。したがって、System.inから複数のオブジェクトを作成しようとした場合と同じように、すべてのreadLine/すべての呼び出しでポーリングします。リーダー(この場合はBufferedReader)からの呼び出し間で読み取りを分離することに注意してください。改行を使用して、元の設定でそれらを分離できます。このようにして、テスト対象のクライアントでの各呼び出しで必要なものを返します。