3.1 doReturn()-Methode

Jetzt kommt die Magie...

Nehmen wir an, Sie haben ein gefälschtes Scheinobjekt erstellt, aber es muss irgendwie funktionieren. Wenn bestimmte Methoden aufgerufen wurden, wurde etwas Wichtiges getan oder die Methoden lieferten ein bestimmtes Ergebnis zurück. Was zu tun ist?

Mit der Mockito-Bibliothek können Sie einem Scheinobjekt das gewünschte Verhalten hinzufügen.

Wenn Sie möchten, dass ein Scheinobjekt beim Aufruf einer bestimmten Methode ein bestimmtes Ergebnis zurückgibt, können Sie diese „Regel“ mithilfe des folgenden Codes zum Objekt hinzufügen:

Mockito.doReturn(result).when(an object).method name();

Sie sehen, am Ende des Methodenaufrufs method name?findet hier tatsächlich kein Aufruf statt. Die Methode doReturn()gibt ein spezielles Proxy-Objekt zurück, mit dessen Hilfe sie die Aufrufe der Methoden des Objekts überwacht und so die Regel schreibt.

Noch einmal. Es ist einfach eine clevere Art, eine Regel zu schreiben, die einem Scheinobjekt hinzugefügt werden soll . Es erfordert etwas Geschick, solchen Code im Kopf richtig zu interpretieren, wenn man ihn sieht. Kommt mit Erfahrung.

Ich denke, es bedarf eines konkreten Beispiels. Erstellen wir ein Scheinklassenobjekt ArrayListund bitten wir seine Methode, size()die Zahl 10 zurückzugeben. Der vollständige Code sieht folgendermaßen aus:

@ExtendWith(MockitoExtension.class)
class DoReturnTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation () {
         //create a rule: return 10 when calling the size method
        Mockito.doReturn(10).when(mockList).size();

        //the method is called here and will return 10!!
        assertEquals(10, mockList.size());
    }
}

Ja, dieser Code funktioniert, der Test wird nicht fehlschlagen.

3.2 when()-Methode

Es gibt eine andere Möglichkeit, einem Scheinobjekt eine Verhaltensregel hinzuzufügen – durch den Aufruf von Mockito.when(). Es sieht aus wie das:

Mockito.when(an object.method name()).thenReturn(result);

Dies ist die gleiche Art und Weise, eine Scheinobjekt-Verhaltensregel zu schreiben wie die vorherige. Vergleichen:

Mockito.doReturn(result).when(an object).method name();

Hier passiert genau das Gleiche – die Konstruktion einer neuen Regel.

Das erste Beispiel hat zwar zwei Nachteile:

  • Der Anruf ist sehr verwirrend.an object.method name()
  • funktioniert nicht, wenn die Methode methodname()zurückgibt void.

Nun, schreiben wir unser Lieblingsbeispiel mit aufMockito.when()

@ExtendWith(MockitoExtension.class)
class WhenTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        //create a rule: return 10 when calling the size method
        Mockito.when(mockList.size() ).thenReturn(10);

        //the method is called here and will return 10!!
        assertEquals(10, mockList.size());
    }
}

3.3 doThrow()-Methode

Wir haben herausgefunden, wie man eine Scheinobjektmethode dazu bringen kann, ein bestimmtes Ergebnis zurückzugeben. Wie kann ich dafür sorgen, dass eine bestimmte Ausnahme ausgelöst wird? Senden Sie es an doReturn()?

Um zu verhindern, dass die Methode zurückkehrt, also eine Ausnahme auslöst, müssen Sie die Regel mithilfe von festlegen doThrow().

Mockito.doThrow(exception.class).when(an object).method name();

Und dann die zweite Option:

Mockito.when(an object.method name()).thenThrow(exception.class);

Ein bisschen erwartet, oder?

Nun, Sie sehen, Sie beginnen bereits zu verstehen. Lassen Sie es uns anhand eines Beispiels beheben:

@ExtendWith(MockitoExtension.class)
class DoThrowTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
        mockList.size(); //an exception will be thrown here
    }
}

Wenn Sie ein bestimmtes Ausnahmeobjekt auslösen müssen, verwenden Sie die Konstruktion des Formulars:

Mockito.doThrow(new Exception()).when(an object).method name();

Übergeben Sie einfach doThrow()ein Ausnahmeobjekt an die Methode und es wird während des Methodenaufrufs ausgelöst.