In meinem Komponententest muss ich eine Schnittstelle vortäuschen, die zwischen verschiedenen Methoden nextItem()
und isEmpty()
Methoden hat:
Meine Voraussetzung für den Mock ist, dass isEmpty()
zunächst falsch zurückgeben sollte, aber nachdem nextItem()
aufgerufen wurde, sollte isEmpty()
true zurückgeben. Daher mache ich mir mit einem Gegenstand eine Warteschlange vor.
nextItem()
zweite, dritte Zeit usw. führt zu einer bestimmten Art von Ausnahme? P.S. Ich möchte nicht die vollständige Implementierung meiner Schnittstelle für den Test bereitstellen, da andere Methoden darin enthalten sind, was zu einem schwer verständlichen und ausführlichen Code führt.
Das erreichen Sie mit thenAnswer (), ein Feature, das Mockito-Dokumentation als umstritten ansieht:
Ein weiteres kontroverses Feature, das ursprünglich nicht in Mockito enthalten war. Wir empfehlen, einfaches Stubben nur mit toReturn () oder toThrow () zu verwenden. Diese beiden sollten gerade genug sein, um alle sauberen & amp; einfacher Code.
Hier ist thenAnswer:
%Vor%Hier ist ein einfaches Beispiel:
%Vor% willReturn(false, true)
bedeutet: gibt false
beim ersten Aufruf und true
bei Sekunde zurück. Mit InOrder
object wird die Aufrufreihenfolge überprüft. Ändern Sie die Reihenfolge oder entfernen Sie nextItem()
call und der Test schlägt fehl.
Alternativ können Sie diese Syntax verwenden:
%Vor%Wenn Sie eine noch stärkere Spott-Semantik benötigen, können Sie eine schwere Artillerie einsetzen - einen benutzerdefinierten Antwort-Callback:
%Vor%Aber das kann leicht zu nicht zu wartendem Testcode führen, den man mit Vorsicht verwenden sollte.
Endlich kannst du dein wirkliches Objekt ausspionieren , indem du nur ausgewählte Spötteleien machst Methoden.
Mir ist klar, dass Sie explizit geschrieben haben, dass Sie keine vollständige Implementierung von MyQueue bereitstellen möchten, aber um ehrlich zu sein, wäre das das Erste, was ich tun würde.
Tatsächlich biete ich regelmäßig "Schein" -Implementierungen einigermaßen komplexer Schnittstellen / Objekte an, um Tests einfacher zu testen. Ich bin nicht der Einzige, der das denkt: Spring Framework bietet zum Beispiel viele verspottete Versionen komplexer Objekte (MockHttpServletRequest, MockHttpServletResponse, etc.).
In diesem Fall würde ich meinen Test nicht überladen und diese Klasse entweder in einem separaten Paket oder sogar im Produktionscode bereitstellen.
Eine MockQueue würde Ihre Tests viel lesbarer machen als die anderen (wie auch immer korrekten) Antworten, die hier angegeben werden.
Sie können mockito sagen, bei aufeinanderfolgenden Aufrufen derselben verspotteten Methode mit den in die Mockito-Dokumentation .
%Vor% bewirkt, dass der isEmpty()
-Aufruf nur beim ersten Aufruf und nur bei
bewirkt, dass nextItem()
beim ersten Aufruf etwas zurückgibt und bei späteren Aufrufen eine Ausnahme auslöst.
Ich weiß nicht, dass es möglich ist, das Ergebnis einer dieser Methoden von der Abfolge der Aufrufe für die andere abhängig zu machen. Wenn es tatsächlich möglich ist, bin ich mir sicher, dass es sehr viel komplexer ist.