Mockitos Scheinmethoden

1. Übersicht

Dieses Tutorial zeigt verschiedene Verwendungen der statischen Standard- Mock- Methoden der Mockito- API.

Wie bei anderen Artikeln, die sich auf das Mockito-Framework konzentrieren (wie Mockito Verify oder Mockito When / Then), wird die unten gezeigte MyList- Klasse 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 der Mock- 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 das Modell aus:

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

Der folgende Code bestätigt, dass die add- Methode für das Modell 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 der Mock- Methode behandeln, die mit einem Argument versehen ist, das den Namen des Mocks 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 der TestRul e-Schnittstelle namens ExpectedException und fügen sie in eine Testklasse ein:

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

Diese Regel wird verwendet, um Ausnahmen zu behandeln, die von Testmethoden ausgelöst werden.

Im folgenden Code erstellen wir ein Modell für die MyList- Klasse und nennen es myMock :

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

Setzen Sie anschließend eine Erwartung an 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 über das Modell enthält. Dazu müssen zuerst 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.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...) but was 1 time: at com.baeldung.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. Mit Antwort verspotten

Hier zeigen wir die Verwendung einer Mock- Variante, bei der die Strategie für die Antworten des Mocks auf die Interaktion zum Zeitpunkt der Erstellung konfiguriert wird. Diese Mock Unterschrift Methode in der Mockito Dokumentation sieht wie folgt aus :

public static  T mock(Class classToMock, Answer defaultAnswer)

Beginnen wir mit der Definition einer Implementierung der Antwortschnittstelle :

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

Die obige CustomAnswer- Klasse wird zum Generieren eines Mocks verwendet:

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

Wenn wir für eine Methode keine Erwartung festlegen , wird die Standardantwort verwendet, die vom Typ CustomAnswer konfiguriert wurde . Um dies zu beweisen, überspringen wir den Schritt der Erwartungseinstellung und springen zur Methodenausführung:

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

Die folgende Überprüfung und Bestätigung bestätigen, dass die Scheinmethode mit einem Antwortargument wie erwartet funktioniert hat:

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

5. Verspotten mit MockSettings

Die letzte Mock- Methode, die in diesem Artikel behandelt wird, ist die Variante mit einem Parameter vom Typ MockSettings . Diese überladene Methode wird verwendet, um ein nicht standardmäßiges Modell bereitzustellen.

There are several custom settings that are supported by methods of the MockSettings interface, such as registering a listener for method invocations on the current mock with invocationListeners, configuring serialization with serializable, specifying the instance to spy on with spiedInstance, configuring Mockito to attempt to use a constructor when instantiating a mock with useConstructor, and some others.

For the convenience, we will reuse the CustomAnswer class introduced in the previous section to create a MockSettings implementation that defines a default answer.

A MockSettings object is instantiated by a factory method as follows:

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 vorherigen Abschnitt rufen wir die add- Methode einer MyList- Instanz auf und überprüfen mithilfe des folgenden Codeausschnitts , ob eine Mock- Methode mit einem MockSettings- Argument ordnungsgemäß funktioniert:

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

6. Fazit

In diesem Tutorial wurde die Scheinmethode von Mockito ausführlich behandelt. Die Implementierung dieser Beispiele und Codefragmente finden Sie in einem GitHub-Projekt.