Ich arbeite an einem Projekt, in dem klasseninterne Aufrufe üblich sind, die Ergebnisse jedoch oft einfache Werte sind. Beispiel ( kein echter Code ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
Unit-Tests für diese Art von Code zu schreiben ist wirklich schwierig, da ich nur das Konditionssystem testen möchte und nicht die Implementierung der tatsächlichen Bedingungen. (Ich mache das in getrennten Tests.) In der Tat wäre es besser, wenn ich Funktionen bestanden hätte, die die Bedingungen implementieren, und in Tests gebe ich einfach ein wenig Schein. Das Problem bei diesem Ansatz ist das Rauschen: Wir verwenden häufig Generika .
Eine funktionierende Lösung; Es ist jedoch wichtig, das getestete Objekt zum Spion zu machen und die Aufrufe der internen Funktionen zu verfälschen.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
Hier besteht die Sorge, dass die Implementierung des SUT effektiv geändert wird und es problematisch sein kann, die Tests mit der Implementierung synchron zu halten. Ist das wahr? Gibt es bewährte Methoden, um dieses Chaos interner Methodenaufrufe zu vermeiden?
Beachten Sie, dass es sich um Teile eines Algorithmus handelt. Daher ist es möglicherweise keine gewünschte Entscheidung, ihn auf mehrere Klassen aufzuteilen.