Mockito-Test eine void-Methode löst eine Ausnahme aus

399

Ich habe eine Methode mit einem voidRückgabetyp. Es kann auch eine Reihe von Ausnahmen auslösen, daher möchte ich diese Ausnahmen testen, die ausgelöst werden. Alle Versuche sind aus demselben Grund fehlgeschlagen:

Die Methode when (T) im Typ Stubber ist für die Argumente nicht anwendbar (void)

Irgendwelche Ideen, wie ich die Methode zum Auslösen einer bestimmten Ausnahme erhalten kann?

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
Edwardmlyte
quelle
1
Mögliches Duplikat von How to Make Mock to Void Methoden mit Mockito
Willian

Antworten:

706

Die Klammern sind schlecht platziert. Du musst benutzen

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);
                                          ^

und nicht

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
                                                                   ^

Dies wird in der Dokumentation erläutert

JB Nizet
quelle
7
@edwardmlyte Diese Mockito-Inkonsistenz ist einer der Gründe, warum ich zu MoxieMocks
Muel
@clement beide können verwendet werden: docs.mockito.googlecode.com/hg/latest/org/mockito/… . Das Erstellen einer Ausnahme löst sie nicht aus.
JB Nizet
1
@JB Nizet Ich stimme Ihnen voll und ganz zu, aber wenn ich doThrow (neue Ausnahme ()) anstelle von doThrow (Exception.class) schreibe, tritt beim Starten meines Tests der folgende Fehler auf. Erwartete Ausnahme com.company.project.exception.ElementNotFoundException bekam aber org.mockito.exceptions.base.MockitoException:
clement
2
Stellen Sie eine weitere Frage mit dem zu testenden Code, dem Code des Tests und der vollständigen Stapelverfolgung der Ausnahme.
JB Nizet
6
doThrow (neue Ausnahme ()). when (Objekt) .voidMethod (any ());
Soumyajit Swain
14

Wenn Sie sich jemals gefragt haben, wie es mit dem neuen BDD-Stil von Mockito geht:

willThrow(new Exception()).given(mockedObject).methodReturningVoid(...));

Und zum späteren Nachschlagen muss man möglicherweise eine Ausnahme auslösen und dann nichts tun:

willThrow(new Exception()).willNothing().given(mockedObject).methodReturningVoid(...));
Ondrej Burkert
quelle
1
Danke, dass du das hier gepostet hast. Wenn die Methode einen Wert zurückgibt: Given (mockedObject.methodReturningAnObject ()). willThrow (new Exception ()); Wenn die Methode nichts zurückgibt: willThrow (new Exception ()). Given (mockedObject) .methodReturningVoid (...)); Erklärungsformular javadoc: "Das Stubben von Hohlräumen erfordert einen anderen Ansatz als {@link Mockito # when (Object)} (oder BDDMockito.given), da der Compiler keine void-Methoden in Klammern
mag