MockitoJUnitRunner
bietet Ihnen eine automatische Validierung der Framework-Nutzung sowie eine automatische initMocks()
.
Die automatische Validierung der Framework-Nutzung lohnt sich tatsächlich. Sie können besser berichten, wenn Sie einen dieser Fehler machen.
Sie rufen die statische when
Methode, aber das Anstoßen mit einem passenden nicht abgeschlossen thenReturn
, thenThrow
oder then
. (Fehler 1 im Code unten)
Sie rufen verify
einen Mock auf, vergessen jedoch, den Methodenaufruf anzugeben, den Sie überprüfen möchten. (Fehler 2 im Code unten)
Sie rufen die when
Methode nach doReturn
, doThrow
oder
doAnswer
und einen Mock passieren, aber vergessen , die Verfahren zu schaffen , dass Sie Stummel versuchen. (Fehler 3 im Code unten)
Wenn Sie keine Validierung der Framework-Verwendung haben, werden diese Fehler erst beim folgenden Aufruf einer Mockito-Methode gemeldet . Das könnte sein
- in der gleichen Testmethode (wie Fehler 1 unten),
- in der nächsten Testmethode (wie Fehler 2 unten),
- in der nächsten Testklasse.
Wenn sie im letzten Test auftreten, den Sie ausführen (wie Fehler 3 unten), werden sie überhaupt nicht gemeldet.
So könnte jeder dieser Fehlertypen aussehen. Angenommen, JUnit führt diese Tests in der hier aufgeführten Reihenfolge aus.
@Test
public void test1() {
// ERROR 1
// This compiles and runs, but it's an invalid use of the framework because
// Mockito is still waiting to find out what it should do when myMethod is called.
// But Mockito can't report it yet, because the call to thenReturn might
// be yet to happen.
when(myMock.method1());
doSomeTestingStuff();
// ERROR 1 is reported on the following line, even though it's not the line with
// the error.
verify(myMock).method2();
}
@Test
public void test2() {
doSomeTestingStuff();
// ERROR 2
// This compiles and runs, but it's an invalid use of the framework because
// Mockito doesn't know what method call to verify. But Mockito can't report
// it yet, because the call to the method that's being verified might
// be yet to happen.
verify(myMock);
}
@Test
public void test3() {
// ERROR 2 is reported on the following line, even though it's not even in
// the same test as the error.
doReturn("Hello").when(myMock).method1();
// ERROR 3
// This compiles and runs, but it's an invalid use of the framework because
// Mockito doesn't know what method call is being stubbed. But Mockito can't
// report it yet, because the call to the method that's being stubbed might
// be yet to happen.
doReturn("World").when(myMock);
doSomeTestingStuff();
// ERROR 3 is never reported, because there are no more Mockito calls.
}
Als ich diese Antwort vor mehr als fünf Jahren zum ersten Mal schrieb, schrieb ich
Daher würde ich die Verwendung von MockitoJUnitRunner
wo immer möglich empfehlen . Wie Tomasz Nurkiewicz jedoch richtig hervorgehoben hat, können Sie es nicht verwenden, wenn Sie einen anderen JUnit-Läufer wie den Spring-Läufer benötigen.
Meine Empfehlung hat sich jetzt geändert. Das Mockito-Team hat eine neue Funktion hinzugefügt, seit ich diese Antwort zum ersten Mal geschrieben habe. Es ist eine JUnit-Regel, die genau die gleiche Funktion wie die ausführt MockitoJUnitRunner
. Aber es ist besser, weil es die Verwendung anderer Läufer nicht ausschließt.
Einschließen
@Rule
public MockitoRule rule = MockitoJUnit.rule();
in Ihrer Testklasse. Dies initialisiert die Mocks und automatisiert die Framework-Validierung. genau wie MockitoJUnitRunner
tut. Jetzt können Sie aber auch SpringJUnit4ClassRunner
einen anderen JUnitRunner verwenden. Ab Mockito 2.1.0 gibt es zusätzliche Optionen, die genau steuern, welche Probleme gemeldet werden.