Wie verspotte ich Methoden mit dem Rückgabetyp void?
Ich habe ein Beobachtermuster implementiert, kann es aber mit Mockito nicht verspotten, weil ich nicht weiß wie.
Und ich habe versucht, ein Beispiel im Internet zu finden, aber es ist mir nicht gelungen.
Meine Klasse sieht so aus:
public class World {
List<Listener> listeners;
void addListener(Listener item) {
listeners.add(item);
}
void doAction(Action goal,Object obj) {
setState("i received");
goal.doAction(obj);
setState("i finished");
}
private string state;
//setter getter state
}
public class WorldTest implements Listener {
@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...
}
}
interface Listener {
void doAction();
}
Das System wird nicht mit Mock ausgelöst.
Ich möchte den oben genannten Systemstatus anzeigen. Und machen Sie Aussagen nach ihnen.
Antworten:
Schauen Sie sich die Mockito API-Dokumente an . Als das verknüpfte Dokument (Point # 12) erwähnt Sie eine der verwenden können
doThrow()
,doAnswer()
,doNothing()
,doReturn()
Familie von Methoden aus Mockito Rahmen Leere Methoden zu verspotten.Zum Beispiel,
oder wenn Sie es mit Follow-up-Verhalten kombinieren möchten,
Angenommen, Sie möchten den Setter
setState(String s)
in der unten stehenden Klasse WorlddoAnswer
verspotten, verwendet der Code die Methode, um den zu verspottensetState
.quelle
setRate()
istfinal
und kann daher nicht verspottet werden. Versuchen Sie stattdessencreate()
eine Instanz, die das tut, was Sie brauchen. Es sollte nicht nötig sein, sich zu verspottenRateLimiter
.Ich glaube, ich habe eine einfachere Antwort auf diese Frage gefunden. Um die reale Methode für nur eine Methode aufzurufen (auch wenn sie eine ungültige Rückgabe hat), können Sie dies tun:
Oder Sie können die reale Methode für alle Methoden dieser Klasse aufrufen, indem Sie Folgendes tun:
quelle
Wenn Sie zusätzlich zu dem, was @sateesh gesagt hat, eine void-Methode verspotten möchten, um zu verhindern, dass der Test sie aufruft, können Sie Folgendes verwenden
Spy
:Wenn Sie Ihren Test ausführen möchten, stellen Sie sicher, dass Sie die zu testende Methode für das
spy
Objekt und nicht für dasworld
Objekt aufrufen . Zum Beispiel:quelle
Die Lösung des sogenannten Problems besteht darin, eine
spy
Mockito.spy (...) anstelle einermock
Mockito.mock (..) zu verwenden .Spion ermöglicht es uns, teilweise zu verspotten. Mockito ist gut in dieser Angelegenheit. Da Sie eine Klasse haben, die nicht vollständig ist, verspotten Sie auf diese Weise einen erforderlichen Platz in dieser Klasse.
quelle
Zuallererst: Sie sollten immer mockito static importieren, damit der Code viel besser lesbar (und intuitiver) ist:
Zum teilweisen Verspotten und Beibehalten der ursprünglichen Funktionalität im Rest bietet mockito "Spy" an.
Sie können es wie folgt verwenden:
Um zu verhindern, dass eine Methode ausgeführt wird, können Sie Folgendes verwenden:
Um einer Methode ein benutzerdefiniertes Verhalten zu verleihen, verwenden Sie "when" mit einem "thenReturn":
Weitere Beispiele finden Sie in den hervorragenden Mockito-Beispielen im Dokument.
quelle
Wie man leere Methoden mit mockito verspottet - es gibt zwei Möglichkeiten:
doAnswer
- Wenn wir wollen, dass unsere verspottete Void-Methode etwas bewirkt (verspotten Sie das Verhalten, obwohl es nichtig ist).doThrow
- Dann gibt es,Mockito.doThrow()
wenn Sie eine Ausnahme von der verspotteten void-Methode auslösen möchten.Im Folgenden finden Sie ein Beispiel für die Verwendung (kein idealer Anwendungsfall, sondern nur zur Veranschaulichung der grundlegenden Verwendung).
Weitere Informationen zum Verspotten und Testen von Void- Methoden mit Mockito finden Sie in meinem Beitrag Wie man sich mit Mockito verspottet (Eine umfassende Anleitung mit Beispielen)
quelle
Hinzufügen einer weiteren Antwort zum Haufen (kein Wortspiel beabsichtigt) ...
Sie müssen die doAnswer-Methode aufrufen, wenn Sie keine Spys verwenden können. Sie müssen jedoch nicht unbedingt Ihre eigene Antwort rollen . Es gibt mehrere Standardimplementierungen. Insbesondere CallsRealMethods .
In der Praxis sieht es ungefähr so aus:
Oder:
quelle
In Java 8 kann dies etwas sauberer gemacht werden, vorausgesetzt, Sie haben einen statischen Import für
org.mockito.Mockito.doAnswer
:Das
return null;
ist wichtig und ohne es schlägt die Kompilierung mit einigen ziemlich undurchsichtigen Fehlern fehl, da es nicht in der Lage ist, eine geeignete Überschreibung für zu findendoAnswer
.Zum Beispiel könnte ein
ExecutorService
, der alleRunnable
übergebenen Daten sofort ausführtexecute()
, implementiert werden mit:quelle
Ich denke, Ihre Probleme sind auf Ihre Teststruktur zurückzuführen. Ich fand es schwierig, Spott mit der traditionellen Methode zur Implementierung von Schnittstellen in der Testklasse zu mischen (wie Sie es hier getan haben).
Wenn Sie den Listener als Mock implementieren, können Sie die Interaktion überprüfen.
Dies sollte Sie davon überzeugen, dass die 'Welt' das Richtige tut.
quelle
Verwenden von Mockito.doThrow wie in:
Sie können dieses schöne Beispiel ausprobieren:
Quelle: http://apisonar.com/java-examples/org.mockito.Mockito.doThrow.html#Example-19
quelle