Mockito: Methode der Rückgabewert hängt davon ab, eine andere Methode aufgerufen
In meinem unit-test-ich müssen zu verspotten, eine Schnittstelle, die zwischen verschiedenen Methoden hat nextItem()
und isEmpty()
Methoden:
public interface MyQueue {
Item nextItem();
boolean isEmpty();
//other methods
...
}
Meine Forderung für die mock ist, dass isEmpty()
zunächst sollte false zurückgeben, aber nach nextItem()
genannt wurde isEmpty()
sollte true zurückgeben. Also ich bin mocking eine Warteschlange mit einem Element.
- Was ist die einfachste Möglichkeit zum implementieren dieser Art von mock mit mockito?
- Kann ich implementieren, zusätzliche Anforderung: Aufruf
nextItem()
zweite, Dritte mal, und so wird Ergebnis in eine bestimmte Art von exception?
P. S. ich will nicht die komplette Umsetzung meines Schnittstelle für den test, weil Sie andere Methoden, wodurch Sie schwer zu verstehen und ausführlichen code.
- Sie können eine boolean-variable, die können Sie Umschalten auf true, wenn Sie geben Sie nextItem()
- können Sie vorschlagen, die Umsetzung, die nicht verbose?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erreichen, dass mit thenAnswer(), eine Funktion, die Mockito-Dokumentation sieht, wie umstritten:
Doch eine weitere umstrittene Eigenschaft, die nicht im Mockito ursprünglich. Wir empfehlen die Verwendung von einfach stubbing mit toReturn() oder toThrow() nur. Diese beiden sollte gerade genug, um test - /Probefahrt jeder clean & simple-code.
Hier thenAnswer:
called
, die nur in einer test-Methode. Wir können nicht nur die Erklärung dercalled
innen test-Methode, weil es muss dann endgültig.Hier ist ein einfaches Beispiel:
willReturn(false, true)
bedeutet: zurückfalse
auf den ersten Aufruf und dietrue
auf den zweiten.InOrder
- Objekt wird verwendet, um zu überprüfen, Aufruf-Reihenfolge. Ändern Sie die Reihenfolge oder entfernennextItem()
Anruf, und der test schlägt fehl.Alternativ können Sie diese syntax verwenden:
Wenn Sie noch stärker Spott Semantik, die Sie sich vorstellen können, die schwere Artillerie - benutzerdefinierte Antwort-Rückruf:
Aber dies kann leicht dazu führen, dass wartbaren test-code, mit Vorsicht zu verwenden.
Schließlich können Sie spy Ihre realen Objekt durch Spott nur ausgewählten Methoden.
isEmpty()
wird nicht mehr als einmal aufgerufen werden, bevornextItem()
genannt wird.when(mock.isEmpty()).thenReturn(false, true);
. Beachten Sie auch, dass die Dritte und alle nachfolgenden Aufrufe vonisEmpty()
auch zurücktrue
- wenn Sie mehrere Werte zurückgeben, nachdemthenReturn
oderwillReturn
, den letzten Wert, den Sie der Liste zurückgegeben werden können wiederholt.Können Sie einige benutzerdefinierte Antwort-Implementierungen, von denen eine bedingt das andere:
und dann:
Könnten Sie zu zwicken, als ich noch nicht getestet, code, aber der Ansatz sollte sein, was Sie brauchen.
Mir ist klar, dass Sie explizit geschrieben, dass Sie nicht wollen, um eine vollständige Umsetzung der MyQueue, aber, um ehrlich zu sein, das wäre das erste, was, das ich tun würde.
In der Tat habe ich regelmäßig 'mock' - Implementierungen von einigermaßen komplexen interfaces/Objekte für den Zweck der tests einfacher zu testen. Ich bin nicht der einzige, zu denken, dass: das Spring-Framework bietet viele verspottet Versionen von komplexen Objekten (MockHttpServletRequest, MockHttpServletResponse, etc.), zum Beispiel.
In diesem Fall, würde ich nicht zu überfrachten meine test-und diese Klasse entweder in einem separaten Paket oder auch in der Produktion von code.
Einen MockQueue würde Ihren tests viel besser lesbar als die andere (aber richtige) Antworten hier suggerieren.
MyQueue mock = new MockUp<MyQueue>() { boolean nextItemCalled; @Mock boolean isEmpty() { return nextItemCalled; } @Mock Item nextItem() { nextItemCalled = true; return someItem; } }.getMockInstance();
Collection
- Schnittstelle? Ich habe gesehen, einige Leute tun es, aber das klingt nicht wie eine gute Idee für mich. Eine Schnittstelle namensQueue
gibt einige grundlegende Annahmen zu den Kunden von die-Schnittstelle. Auch wenn sich die Implementierungen unterscheiden, das Allgemeine Verhalten sollte mehr oder weniger das gleiche von dem Punkt der Sicht der client-Klassen. Sie haben ein mehr konkretes Beispiel für eine situation, wo das nicht funktionieren würde?Können Sie sagen, mockito zu beantworten, anders auf aufeinander folgende Aufrufe an die gleiche verspottet-Verfahren unter Verwendung der beschriebenen Techniken in die docs mockito.
wird die
isEmpty()
Aufruf true zurück, nur auf den ersten Anruf, undmachen
nextItem()
Gegenzug etwas auf den ersten Anruf, und eine Ausnahme werfen, auf die Sie später Anrufe.Ich weiß nicht, dass es möglich ist, das Ergebnis einer dieser Methoden hängt von der Sequenzierung der Anrufe zu den anderen, obwohl. Wenn es wirklich möglich ist, ich bin sicher, es ist viel komplexer.
isEmpty()
nur einmal aufgerufen werden, bevornextItem()
genannt wird.Können Sie eine utility-Methode und verwenden Sie es, wo immer Sie wollen.
Einfache Nutzung:
In diesem Fall müssen Sie keine zusätzliche Variablen und es ist mehr "Mockito Stil".