öffentliche Klasse A { public void method (boolean b) { if (b == true) Methode 1(); sonst Methode2 (); }} private void method1 () {} private void method2 () {} }}
öffentliche Klasse TestA { @Prüfung public void testMethod () { A a = Schein (A. Klasse); a.method (true); // wie man testet wie verify (a) .method1 (); }} }}
Wie man eine private Methode testet oder nicht, und wie man eine private Methode mit mockito testet ???
Antworten:
Mit Mockito können Sie das nicht tun, aber Sie können Powermock verwenden , um Mockito zu erweitern und private Methoden zu verspotten. Powermock unterstützt Mockito. Hier ist ein Beispiel.
quelle
Nicht möglich durch Mockito. Aus ihrem Wiki
quelle
Hier ist ein kleines Beispiel, wie man es mit Powermock macht
Um Methode1 zu testen, verwenden Sie Code:
Verwenden Sie Folgendes, um ein privates Objektobjekt festzulegen :
quelle
Denken Sie darüber in Bezug auf das Verhalten nach, nicht in Bezug auf die Methoden, die es gibt. Die aufgerufene Methode
method
hat ein bestimmtes Verhalten, wenn sieb
wahr ist. Es hat ein anderes Verhalten, wennb
es falsch ist. Dies bedeutet, dass Sie zwei verschiedene Tests für schreiben solltenmethod
; eine für jeden Fall. Anstatt drei methodenorientierte Tests zu haben (einen fürmethod
, einen fürmethod1
, einen fürmethod2
, einen für , haben Sie zwei verhaltensorientierte Tests.Im Zusammenhang damit (ich habe dies kürzlich in einem anderen SO-Thread vorgeschlagen und als Ergebnis ein Wort aus vier Buchstaben genannt, also zögern Sie nicht, dies mit einem Körnchen Salz zu nehmen); Ich finde es hilfreich, Testnamen zu wählen, die das Verhalten widerspiegeln, das ich teste, und nicht den Namen der Methode. So rufen Sie nicht Ihre Tests
testMethod()
,testMethod1()
,testMethod2()
und so weiter. Ich mag Namen wiecalculatedPriceIsBasePricePlusTax()
odertaxIsExcludedWhenExcludeIsTrue()
die anzeigen, welches Verhalten ich teste; Testen Sie dann innerhalb jeder Testmethode nur das angegebene Verhalten. Die meisten dieser Verhaltensweisen umfassen nur einen Aufruf einer öffentlichen Methode, können jedoch viele Aufrufe privater Methoden beinhalten.Hoffe das hilft.
quelle
Obwohl Mockito diese Funktion nicht bietet, können Sie mit Mockito + der JUnit ReflectionUtils-Klasse oder der Spring ReflectionTestUtils- Klasse dasselbe Ergebnis erzielen . Bitte beachten Sie ein Beispiel unten genommen von hier zu erklären , wie eine private Methode aufzurufen:
Vollständige Beispiele mit ReflectionTestUtils und Mockito finden Sie im Buch Mockito for Spring
quelle
Sie sollten keine privaten Methoden testen. Es müssen nur nicht private Methoden getestet werden, da diese die privaten Methoden sowieso aufrufen sollten. Wenn Sie private Methoden "testen" möchten, bedeutet dies möglicherweise, dass Sie Ihr Design überdenken müssen:
Benutze ich die richtige Abhängigkeitsinjektion? Muss ich möglicherweise die privaten Methoden in eine separate Klasse verschieben und das lieber testen? Müssen diese Methoden privat sein? ... können sie nicht standardmäßig oder eher geschützt sein?
In dem obigen Fall müssen die beiden Methoden, die als "zufällig" bezeichnet werden, möglicherweise tatsächlich in eine eigene Klasse eingeordnet, getestet und dann in die obige Klasse injiziert werden.
quelle
Ich konnte eine private Methode mit Mockito unter Verwendung von Reflexion testen. Hier ist das Beispiel, das versucht wurde, es so zu benennen, dass es Sinn macht
quelle
Durch die Verwendung von Reflection können private Methoden aus Testklassen aufgerufen werden. In diesem Fall,
// Testmethode wird so sein ...
Wenn die private Methode eine andere private Methode aufruft, müssen wir das Objekt ausspionieren und die andere Methode stubben. Die Testklasse sieht aus wie ...
// Testmethode wird so sein ...
** Der Ansatz besteht darin, Reflexion und Spionage des Objekts zu kombinieren. ** Methode1 und ** Methode2 sind private Methoden und Methode1 ruft Methode2 auf.
quelle
Ich verstehe nicht wirklich, dass Sie die private Methode testen müssen. Das Hauptproblem besteht darin, dass Ihre öffentliche Methode als Rückgabetyp void hat und Sie daher Ihre öffentliche Methode nicht testen können. Daher sind Sie gezwungen, Ihre private Methode zu testen. Ist meine Vermutung richtig?
Einige mögliche Lösungen (AFAIK):
Verspotten Sie Ihre privaten Methoden, aber Sie werden Ihre Methoden trotzdem nicht "tatsächlich" testen.
Überprüfen Sie den Status des in der Methode verwendeten Objekts. Die meisten Methoden verarbeiten entweder die Eingabewerte und geben eine Ausgabe zurück oder ändern den Status der Objekte. Das Testen der Objekte auf den gewünschten Zustand kann ebenfalls verwendet werden.
Überarbeiten Sie Ihren Code ein wenig (Ich hoffe, dies ist kein Legacy-Code). Meine Grundlage beim Schreiben einer Methode ist, dass man immer etwas zurückgeben sollte (ein int / a boolean). Der zurückgegebene Wert KANN oder KANN NICHT von der Implementierung verwendet werden, wird aber SICHER vom Test verwendet
Code.
quelle
Es gibt tatsächlich eine Möglichkeit, Methoden von einem privaten Mitglied mit Mockito zu testen. Angenommen, Sie haben eine Klasse wie diese:
Wenn Sie testen möchten,
a.method
wird eine Methode von aufgerufenSomeOtherClass
, können Sie etwas wie unten schreiben.ReflectionTestUtils.setField();
wird das private Mitglied mit etwas stubben, das Sie ausspionieren können.quelle
Legen Sie Ihren Test in dasselbe Paket, aber in einen anderen Quellordner (src / main / java vs. src / test / java) und machen Sie diese Methoden paketprivat. Imo-Testbarkeit ist wichtiger als Datenschutz.
quelle
In Fällen, in denen die private Methode nicht ungültig ist und der Rückgabewert als Parameter für die Methode einer externen Abhängigkeit verwendet wird, können Sie die Abhängigkeit verspotten und mit a
ArgumentCaptor
den Rückgabewert erfassen. Beispielsweise:quelle