Ich habe einige Komponententests durchgeführt und mich nur auf das Thema als Ganzes konzentriert.Komponententest: Erforderlich, um Methoden der Klasse selbst zu verspotten?
ich auf das folgende Szenario ab, nehme ich eine Klasse wie dieses:
class A{
public B mehtod_1(B b){
b = method_2(b);
b = method_3(b);
b += 1;
return b;
}
public B method_2(B b){
// do something to B without external dependency
return B;
}
public B method_3(B b){
// do something else to B without external dependency
return B;
}
}
I-Tests für method_2
und method_3
ohne Probleme schreiben kann, haben verschiedene Tests, die von B auf unterschiedliche Weise zu konfigurieren und die Durchsetzung erwartete Transformation auf B nach dem Aufruf, diese Methoden sind atomar.
Also meine Frage ist:
Wenn ich method_1
in einer atomaren Weise zu testen, würde ich die Anrufe method_2
spotten haben und method_3
da, wenn ich tatsächlich diese Methoden aufrufen, würde ich nicht method_1
in einem Atom testen würde Gutshof.
In letzterem Fall ist method_2
wurde dann gebrochen die Tests für method_1
und method_2
würde brechen, und das wäre irreführend. Wenn ich den method_2
Anruf innerhalb des method_1
Testes verspotten würde, würde nur der method_2
Test ausfallen und eine klarere Anzeige geben, wo der Fehler ist (nämlich irgendwo in der Geschäftslogik von method_1
gegeben alle anderen aufgerufenen Methoden funktionierten wie erwartet).
Habe ich das Konzept hier richtig verstanden?
Auf der anderen Seite ist es richtig, wenn beide Tests fehlschlagen, da in der realen Welt method_1
nicht funktionieren kann ohne method_2
funktioniert.
würde Mein Bauch sagt Unteilbarkeit der Tests ist es, was gewünscht wird, die erste Lösung bedeutet, wo es ein Test für method_1
ist, für jedes mögliche Ergebnis method_2
und method_3
(statisch verspottet).
Gibt es einen "richtigen"/gemeinsamen/Best Practice Weg?
Ich benutzte @Spy tatsächlich, um diese Methoden teilweise zu verspotten. Es war mir nicht klar, dass Unit Tests eigentlich nur dazu gedacht waren, die öffentliche Schnittstelle der Methoden/Klasse zu testen. Wenn das der Fall ist, macht es keinen Sinn, interne Methoden vorzutäuschen. Und +1 für Hinweise, dass öffentliche Methoden wahrscheinlich nicht voneinander abhängen sollten (abgesehen vielleicht von Methoden, die Wrapper sind, da Java keine Standardparameter unterstützt) – Tom