Sie haben eine Klasse X und schreiben einige Komponententests, die das Verhalten X1 verifizieren. Es gibt auch Klasse A, die X als Abhängigkeit nimmt.
Wenn Sie Komponententests für A schreiben, verspotten Sie X. Mit anderen Worten, wenn Sie Komponententests für A durchführen, setzen Sie das Verhalten von Xs Verspottung auf X1 (postulieren). Die Zeit vergeht, Menschen nutzen Ihr System, müssen sich ändern, X entwickelt sich weiter: Sie modifizieren X, um Verhalten X2 zu zeigen. Offensichtlich schlagen Unit-Tests für X fehl und Sie müssen sie anpassen.
Aber was ist mit A? Unit-Tests für A schlagen nicht fehl, wenn das Verhalten von X geändert wird (aufgrund der Verspottung von X). Wie erkennt man, dass das Ergebnis von A anders ausfällt, wenn es mit dem "echten" (modifizierten) X ausgeführt wird?
Ich erwarte Antworten auf die Frage: "Das ist nicht der Zweck von Unit-Tests", aber welchen Wert haben Unit-Tests dann? Sagt es Ihnen wirklich nur, dass Sie, wenn alle Tests bestanden sind, keine grundlegende Änderung eingeführt haben? Und wenn sich das Verhalten einer Klasse (freiwillig oder unfreiwillig) ändert, wie können Sie (am besten automatisiert) alle Konsequenzen erkennen? Sollten wir uns nicht mehr auf Integrationstests konzentrieren?
X1
, sagen Sie, dass X
die Schnittstelle implementiert X1
. Wenn Sie die Schnittstelle X1
auf X2
den in den anderen Tests verwendeten Mock ändern , sollte die Kompilierung nicht mehr möglich sein. Daher müssen Sie auch diese Tests korrigieren. Änderungen im Klassenverhalten sollten keine Rolle spielen. Tatsächlich sollte Ihre Klasse A
nicht von Implementierungsdetails abhängen (was Sie in diesem Fall ändern würden). Die Unit-Tests für A
sind also immer noch korrekt und zeigen an, dass dies A
bei einer idealen Implementierung der Schnittstelle funktioniert.