Ich lese this answer über Unit-Test eine Wrapper-Methode. Im folgenden Code:Unit-Test-Wrapper-Methoden, wenn Basis-Methode ist privat
public static Object methodA(Object arg) {
if (arg == null) {
return null;
} else {
return methodB();
}
}
Es sieht vernünftig, dass ich brauche, um alle Funktionen nicht zu testen in methodB()
, nur Test 2 Fällen, in denen arg
null ist und nicht, weil methodB()
sollte bereits getestet werden.
Wenn jedoch methodB()
Privat Methode ist, sollte ich alle Funktionen testen, die methodB()
bieten wird, da nach another answer, private Methoden Implementierungsdetails sind.
Das Problem ist, wenn ich zwei Methoden methodA1()
und methodA2()
und sie alle Anruf methodB()
wie folgt aus:
public static MyObject methodA1(int x) {
MyObject obj = new MyObject();
obj.setX(x);
return methodB(obj);
}
public static MyObject methodA2(int y) {
MyObject obj = new MyObject();
obj.setY(y);
return methodB(obj);
}
private static MyObject methodB(MyObject obj) {
// doSomething with obj
return obj;
}
Sollte ich testen methodA1()
und methodA2()
getrennt? Oder kann ich nur testen Sie die private Methode methodB()
weil methodA1()
und methodA2()
sind nur Wrapper-Methoden von methodB()
, also wenn methodB()
richtig getestet wird, werde ich nicht methodA1()
und methodA2()
überhaupt testen müssen.
EDIT:
Ich schrieb separate Tests für öffentliche Methoden auf den ersten. Aber das Problem ist, wenn es viele Varianten des methodA
gibt und einige der Funktionalitäten/Anforderungen in einigen von ihnen geteilt werden, dann wird der Code der Testfälle dupliziert. Deshalb frage ich mich, ob ich private Methode methodB()
testen sollte.
Das eigentliche Problem, das ich traf, ist ich habe Anforderung, einen Datensatz in der Datenbank hinzuzufügen, und es gibt viele verschiedene APIs, die ich bereitstellen sollte. Zum Beispiel sollte ich bieten:
MyObject addMale(String name, String job); // fill sex with "Male"
MyObject addStudent(String name, String sex); // fill job with "Student"
Und alle von ihnen überprüft der Parameter gültig ist oder nicht, füllen Sie das Feld, das nicht angegeben wird und die private Methode aufrufen, tatsächlich um den Datensatz in die Datenbank einfügen, die so ist genannt methodB()
.
Es gibt viele APIs wie diese, wenn ich nur methodB()
mit allen Feldern Situation testen kann, kann ich vielleicht die Vervielfältigung der Testfälle reduzieren, aber ist das eine gute Praxis, die Unit-Tests so zu machen?
EDIT2:
Ich weiß, dass ich private Methoden testen, weil ich Reflexion in meinen anderen Testfällen, und ich weiß es private Methoden aufrufen kann, auch. Aber meine Frage ist in dieser Situation, Testen privater Methoden ist eine richtige Lösung oder nicht.
Wenn 'methodA1' etwas anderes als' methodA2' tut, dann benötigt es eindeutig einen separaten Test. Wenn beide Methoden dasselbe tun, benötigen Sie nur die eine Methode. – AJNeufeld
Erweiterung eines Bits: 'methodA1' ruft **' setX' ** für ein Objekt auf und übergibt es an 'methodB', wobei' methodA2' ** 'setY' ** für ein Objekt aufruft und an 'methodB' übergibt . Das Verhalten von 'methodB' wird unterschiedlich sein, abhängig davon, ob das' X' des Objekts gesetzt ist oder ob sein 'Y' gesetzt ist. Beide müssen getestet werden. Wenn Sie 'methodB' getestet haben, müssten Sie sowieso Testfälle für beide Fälle schreiben. Macht es auch klar, indem Sie den Testfall für "A1" und "A2" schreiben. – AJNeufeld
Das Ausführen einer Code-Coverage-Analyse Ihres Komponententests würde eine größere Abdeckung anzeigen, wenn Sie Komponententests für "methodA1" und "methodA2" statt nur für "methodB" ausführen würden. – AJNeufeld