Check
ブロッキングwaitForCondition()
メソッドを持つ非常に単純なクラスがあります。このメソッドはブロックしています。このメソッドの単体テストをいくつか作成したいと思います。まず、条件が満たされたときにメソッドが戻る必要があります。第二に、メソッドは中断されたときに戻る必要があります。
内部的に、Check
クラスには がありArrayBlockingQueue
、そのメソッドを呼び出します。そのtake()
ため、私のテストは、条件のロジックを正しく (あるべきように) コーディングしたかどうかについてです。アプリケーションでは、クラスのデータはメソッドCheck
を介して別のスレッドから供給されます。InputData
このInputData
メソッドは、受信データに対してロジックを実行し、条件が満たされたときにダミー オブジェクトを ArrayBlockingQueue に配置します。waitForCondition()
これにより、返されるはずです。
したがって、最初に考えたのはInputData
、モックを作成してテストし、条件が満たされたときにダミー オブジェクトがキューに追加されることを確認できるということです。これには、クラスの設計を変更する必要があります。これは、キューがプライベート データ メンバーであるためです (プライベート データをモックできる場合を除く)。条件が満たされたときにキューに直接追加する代わりに、InputData
モックできる何かを呼び出す必要があります。
しかし、それが正しく機能しwaitForCondition()
ていることを考えると、メソッド自体をチェックするという問題があります。InputData
それは本当に単純なコードです:
try {
myArrayBlockingQueue.take();
return true;
} catch (InterruptedException ex) {
return false;
}
だから私はそれが想像上の問題に値するかどうか疑問に思っています: で別のスレッドを作成しCheck
、その を呼び出し、waitForCondition()
完了時に何かを返すテスト。おそらく、Executor サービスを使用しています。あいまいな部分は、を同期する方法assertTrue(...)
です。非同期テストに関するこの記事を見つけました。これでうまくいくようです。
質問の要約:
- ロジックをテストするためにデザインを変更する必要が
InputData()
ありますか。 waitForCondition()
がテストされている限り、テストを除外する必要がInputData()
ありますか?- それとも、実行する必要があること (やや複雑な単体テスト) を実行して、
waitForCondition()
直接テストする方がよいでしょうか?