Mockitos Mock-Methoden

Mockito Mock Methoden

1. Überblick

Dieses Tutorial zeigt verschiedene Verwendungen der statischen Standardmethodenmockder APIMockito.

Wie bei anderen Artikeln, die sich auf das Mockito-Framework konzentrieren (wieMockito Verify oderMockito When/Then), wird die unten gezeigte KlasseMyList als Kollaborateur verwendet, der in Testfällen verspottet wird:

public class MyList extends AbstractList {
    @Override
    public String get(int index) {
        return null;
    }

    @Override
    public int size() {
        return 1;
    }
}

2. Einfaches Verspotten

Die einfachste überladene Variante dermock-Methode ist die mit einem einzigen Parameter für die zu verspottende Klasse:

public static  T mock(Class classToMock)

Wir werden diese Methode verwenden, um eine Klasse zu verspotten und eine Erwartung zu setzen:

MyList listMock = mock(MyList.class);
when(listMock.add(anyString())).thenReturn(false);

Führen Sie dann eine Methode für den Mock aus:

boolean added = listMock.add(randomAlphabetic(6));

Der folgende Code bestätigt, dass dieadd-Methode für den Mock aufgerufen wurde und dass der Aufruf einen Wert zurückgibt, der der zuvor festgelegten Erwartung entspricht:

verify(listMock).add(anyString());
assertThat(added, is(false));

3. Verspotten mit Mocks Namen

In diesem Abschnitt werden wir eine andere Variante dermock-Methode behandeln, die mit einem Argument versehen ist, das den Namen des Modells angibt:

public static  T mock(Class classToMock, String name)

Im Allgemeinen hat der Name eines Mocks nichts mit Arbeitscode zu tun, kann jedoch beim Debuggen hilfreich sein, bei dem der Name des Mocks zum Aufspüren von Überprüfungsfehlern verwendet wird.

Um sicherzustellen, dass der angegebene Name eines Modells in der Nachricht einer Ausnahme enthalten ist, die aus einer nicht erfolgreichen Überprüfung ausgelöst wurde, verwenden wir eine JUnit-Implementierung derTestRule-Schnittstelle mit dem NamenExpectedException und schließen sie ein in einer Testklasse:

@Rule
public ExpectedException thrown = ExpectedException.none();

Diese Regel wird verwendet, um Ausnahmen von Testmethoden zu behandeln.

Im folgenden Code erstellen wir ein Modell für die KlasseMyList und nennen esmyMock:

MyList listMock = mock(MyList.class, "myMock");

Setzen Sie anschließend eine Erwartung für eine Methode des Mocks und führen Sie sie aus:

when(listMock.add(anyString())).thenReturn(false);
listMock.add(randomAlphabetic(6));

Wir werden eine absichtlich fehlgeschlagene Überprüfung erstellen, die eine Ausnahme mit der Nachricht auslösen sollte, die Informationen zum Mock enthält. Dazu müssen zunächst die Erwartungen an die Ausnahme festgelegt werden:

thrown.expect(TooLittleActualInvocations.class);
thrown.expectMessage(containsString("myMock.add"));

Die folgende Überprüfung sollte fehlschlagen und eine Ausnahme auslösen, die den Erwartungen entspricht:

verify(listMock, times(2)).add(anyString());

Hier ist die Nachricht der ausgelösten Ausnahme:

org.mockito.exceptions.verification.TooLittleActualInvocations:
myMock.add();
Wanted 2 times:
at com.example.mockito.MockitoMockTest
  .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)
but was 1 time:
at com.example.mockito.MockitoMockTest
  .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)

Wie wir sehen können, wurde der Name des Mocks in die Ausnahmemeldung aufgenommen. Dies ist hilfreich, um den Fehlerpunkt im Falle einer nicht erfolgreichen Überprüfung zu finden.

4. Verspotten mitAnswer

Hier zeigen wir die Verwendung einermock-Variante, bei der die Strategie für die Antworten des Mocks auf die Interaktion zum Zeitpunkt der Erstellung konfiguriert wird. Die Signatur diesermock-Methode in der Mockito-Dokumentation sieht folgendermaßen aus:

public static  T mock(Class classToMock, Answer defaultAnswer)

Beginnen wir mit der Definition einer Implementierung derAnswer-Schnittstelle:

class CustomAnswer implements Answer {
    @Override
    public Boolean answer(InvocationOnMock invocation) throws Throwable {
        return false;
    }
}

Die obigeCustomAnswer-Klasse wird zur Erzeugung eines Mocks verwendet:

MyList listMock = mock(MyList.class, new CustomAnswer());

Wenn wir für eine Methode keine Erwartung festlegen, kommt die Standardantwort ins Spiel, die durch den TypCustomAnswerkonfiguriert wurde. Um dies zu beweisen, überspringen wir den Schritt zum Festlegen der Erwartung und springen zur Ausführung der Methode:

boolean added = listMock.add(randomAlphabetic(6));

Die folgende Überprüfung und Bestätigung bestätigt, dass die Methodemockmit dem ArgumentAnswerwie erwartet funktioniert hat:

verify(listMock).add(anyString());
assertThat(added, is(false));

5. Verspotten mitMockSettings

Die letztemock-Methode, die in diesem Artikel behandelt wird, ist die Variante mit einem Parameter vom TypMockSettings. Diese überladene Methode wird verwendet, um einen Nicht-Standard-Mock bereitzustellen.

Es gibt verschiedene benutzerdefinierte Einstellungen, die von Methoden derMockSettings-Schnittstelle unterstützt werden, z. B. das Registrieren eines Listeners für Methodenaufrufe im aktuellen Mock mitinvocationListeners, das Konfigurieren der Serialisierung mitserializable und das Angeben der Instanz um mitspiedInstance auszuspionieren und Mockito so zu konfigurieren, dass versucht wird, einen Konstruktor zu verwenden, wenn ein Mock mituseConstructor und einigen anderen instanziiert wird.

Der Einfachheit halber werden wir die im vorherigen Abschnitt eingeführte KlasseCustomAnswerwiederverwenden, um eine Implementierung vonMockSettingszu erstellen, die eine Standardantwort definiert.

Das Objekt einesMockSettingswird durch eine Factory-Methode wie folgt instanziiert:

MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer());

Dieses Einstellungsobjekt wird bei der Erstellung eines neuen Modells verwendet:

MyList listMock = mock(MyList.class, customSettings);

Ähnlich wie im vorhergehenden Abschnitt werden wir dieadd-Methode einerMyList-Instanz aufrufen und überprüfen, ob einemock-Methode mit einemMockSettings-Argument so funktioniert, wie es beabsichtigt ist das folgende Code-Snippet:

boolean added = listMock.add(randomAlphabetic(6));
verify(listMock).add(anyString());
assertThat(added, is(false));

6. Fazit

In diesem Tutorial wurde diemock-Methode von Mockito ausführlich behandelt. Die Implementierung dieser Beispiele und Codefragmente finden Sie ina GitHub project.