Gibt es eine Möglichkeit, dass eine Stubbed-Methode bei nachfolgenden Aufrufen unterschiedliche Objekte zurückgibt? Ich möchte dies tun, um unbestimmte Antworten von einem zu testen ExecutorCompletionService
. dh um zu testen, dass unabhängig von der Rückgabereihenfolge der Methoden das Ergebnis konstant bleibt.
Der Code, den ich testen möchte, sieht ungefähr so aus.
// Create an completion service so we can group these tasks together
ExecutorCompletionService<T> completionService =
new ExecutorCompletionService<T>(service);
// Add all these tasks to the completion service
for (Callable<T> t : ts)
completionService.submit(request);
// As an when each call finished, add it to the response set.
for (int i = 0; i < calls.size(); i ++) {
try {
T t = completionService.take().get();
// do some stuff that I want to test
} catch (...) { }
}
doAnswer
oder schreiben keineAnswer
in dem Fall, den Sie erwähnen. Sie können einfach verwendendoReturn(...).when(someSpy).someMethod(...)
. Es scheint vernünftig anzunehmen, dass Emma eher an Spott als an Spionen interessiert ist, aber ich denke, ich könnte meiner Antwort etwas hinzufügen, um dies zu formulieren. Danke für den Kommentar.Wie bereits erwähnt, sind fast alle Anrufe verkettbar.
Sie könnten also anrufen
Weitere Informationen in Mockitos Dokumentation .
quelle
mock.method
in diesem Beispiel aufgerufen wurde? Ich möchte so etwas wie, beim ersten Mal foo zurückkehren, aber für den Rest den Balken zurückgeben.Sie können sogar
doReturn()
Methodenaufrufe wie diese verkettensüß ist es nicht :)
quelle
Ich habe eine
MultipleAnswer
Klasse implementiert , die mir hilft, bei jedem Anruf unterschiedliche Antworten zu finden. Hier der Code:quelle
Das Folgende kann als gemeinsame Methode verwendet werden, um verschiedene Argumente bei verschiedenen Methodenaufrufen zurückzugeben. Wir müssen nur ein Array mit der Reihenfolge übergeben, in der Objekte bei jedem Aufruf abgerufen werden sollen.
Ex.
getAnswerForSubsequentCalls(mock1, mock3, mock2);
gibt beim ersten Aufruf das Objekt mock1, beim zweiten Aufruf das Objekt mock3 und beim dritten Aufruf das Objekt mock2 zurück. Sollte wiewhen(something()).doAnswer(getAnswerForSubsequentCalls(mock1, mock3, mock2));
folgt verwendet werden. Dies ist fast ähnlich zuwhen(something()).thenReturn(mock1, mock3, mock2);
quelle
Im Zusammenhang mit der Antwort von @ [Igor Nikolaev] vor 8 Jahren
Answer
kann die Verwendung von a mithilfe eines in Java 8 verfügbaren Lambda-Ausdrucks etwas vereinfacht werden .oder einfacher:
quelle
BDD-Stil:
quelle
quelle