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.
@ExtendWith
. Es ist nicht wirklich etwas, von dem ich weiß. Das Tolle an Stack Overflow ist, dass Sie bei einer solchen Frage mehrere richtige Antworten erhalten können.Mit Runner können Sie ein wenig Codierung sparen (keine
@Before
Methode erforderlich ). Andererseits ist die Verwendung eines Läufers manchmal nicht möglich, dh wenn Sie bereits einen verwenden, wie zSpringJUnit4ClassRunner
.Das ist es. Es ist nur eine Frage der Präferenz.
quelle
@Before
Methode etwas anderes enthielt,initMocks()
als dass Sie es nach der Migration auf Runner beibehalten müssen.SpringJUnit4ClassRunner
Mocks automatisch für mich initialisiert werden. Ich weiß jedoch nichts über einfachen Frühling.