Mockito: Der Rückgabewert der Methode hängt von anderen aufgerufenen Methoden ab

7

In meinem Komponententest muss ich eine Schnittstelle vortäuschen, die zwischen verschiedenen Methoden nextItem() und isEmpty() Methoden hat:

%Vor%

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.

  1. Was ist der einfachste Weg, um diese Art von Spott mit Mockito zu implementieren?
  2. Kann ich zusätzliche Anforderungen implementieren: Aufruf von 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.

    
pavel_kazlou 29.09.2012, 21:04
quelle

6 Antworten

9

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%     
Assen Kolov 29.09.2012, 21:56
quelle
5

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.

    
Tomasz Nurkiewicz 29.09.2012 21:18
quelle
2

Sie können einige benutzerdefinierte Antwort-Implementierungen bereitstellen, von denen eine von der anderen abhängt:

%Vor%

und dann benutze es:

%Vor%

Sie könnten dies optimieren, da ich diesen Code nicht getestet habe, aber der Ansatz sollte das sein, was Sie brauchen.

    
Matt 29.09.2012 21:58
quelle
2

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.

    
Eric 01.10.2012 12:46
quelle
1

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

wahr wird %Vor%

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.

    
Don Roby 29.09.2012 21:24
quelle
1

Sie können eine Hilfsmethode erstellen und sie dann verwenden, wo Sie wollen.

%Vor%

Einfache Verwendung:

%Vor%

In diesem Fall brauchen Sie keine zusätzlichen Variablen und es ist mehr "Mockito Stil".

    
dvelopp 21.10.2016 14:01
quelle

Tags und Links