私はクラスの内部呼び出しが通常であるプロジェクトに取り組んでいますが、結果は何回も単純な値です。例(実際のコードではありません):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
このタイプのコードの単体テストを書くのは、実際の条件の実装ではなく、条件システムをテストするだけなので、非常に困難です。(私は別のテストでそれを行います。)実際、条件を実装する関数を渡した方が良いでしょうし、テストではモックを提供するだけです。このアプローチの問題は騒々しいです:ジェネリックを多く使用します。
実用的なソリューション。ただし、テスト対象のオブジェクトをスパイにし、内部関数の呼び出しを模擬することです。
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
ここでの懸念は、SUTの実装が効果的に変更されることであり、テストを実装と同期させておくことが問題になる場合があります。これは本当ですか?この内部メソッド呼び出しの混乱を避けるためのベストプラクティスはありますか?
アルゴリズムの一部について説明していることに注意してください。そのため、いくつかのクラスに分割することは望ましい決定ではない場合があります。