CodeGym/Java-Kurse/Modul 3: Java Professional/Aufruf von Scheinmethoden mit Parametern

Aufruf von Scheinmethoden mit Parametern

Verfügbar

4.1 Methodenparameter

Die vorherigen Regeln, die dem Scheinobjekt hinzugefügt wurden, befassten sich mit Methoden ohne Parameter. Und wie erstellt man Regeln für Methoden mit Parametern? Darüber hinaus möchte ich Regeln erstellen, damit es für einige Parameterwerte ein Ergebnis gibt und für andere ein anderes.

So können Sie es auch machen. Wenn Sie möchten, dass die Methode mit einem bestimmten Parameter etwas Bestimmtes zurückgibt, kann die Regel wie folgt geschrieben werden:

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

Schauen wir uns zum besseren Verständnis ein Beispiel an. Lassen Sie unsere Liste den Namen Ivan zurückgeben, wenn Sie das 10. Element anfordern, und den Namen Marya, wenn Sie das 500. anfordern. Gesagt, getan.

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

    @Test
    public void whenMockAnnotation() {
        //adding the first rule
        Mockito.doReturn("Ivan").when(mockList).get(10);
        //adding a second rule
        Mockito.doReturn("Maria").when(mockList).get(500);

        assertEquals("Ivan", mockList.get(10));
        assertEquals("Maria", mockList.get(500));

    }
}

4.2 Parametervorlagen

Und sofort werden mir schlaue Kollegen die Frage stellen: „Was ist, wenn die Methode Argumente erfordert, aber für alle Werte das gleiche Ergebnis zurückgeben muss?“ Schreiben wir nicht:

Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);

Nein, niemand zwingt dich, so zu schreiben. Wenn Sie einem Mock-Objekt eine Regel hinzufügen möchten, die für eine Methode mit beliebigen Argumenten funktioniert, dann gibt es dafür ein spezielles Objekt:

Mockito.any()

Unser Beispiel damit würde so geschrieben werden:

Mockito.doReturn("Ivan").when(mockList).get(any(int.class));

Hier gibt es ein paar Nuancen. Das Objekt Mockito.any()hat den Typ Object, daher gibt es Analoga für Parameter unterschiedlichen Typs:

Methode Parametertyp
1 beliebig() Objekt einschließlich null
2 any(ClassName.class) Klassenname
3 anyInt() int
4 anyBoolean() Boolescher Wert
5 anyDouble() doppelt
6 anyList() Aufführen

Genauer gesagt würde unser Beispiel so aussehen:

Mockito.doReturn("Ivan").when(mockList).get(anyInt());

4.3 doAnswer()-Methode

Wir sind zum komplexen Verhalten virtueller Methoden gekommen. Früher oder später wird es eine Situation geben, in der Sie möchten, dass diese virtuelle Methode ein komplexes Verhalten aufweist. Es soll beispielsweise Werte abhängig von den Parametern zurückgeben, die Zeichenfolge in Großbuchstaben umwandeln.

Dafür gibt es eine spezielle Methode – doAnswer(), der eine Funktion übergeben wird, die das tut, was Sie brauchen:

Mockito.doAnswer(function).when(an object).method name(parameter);

Lassen Sie uns die get()Klassenmethode dazu bringen List, das Quadrat des an sie übergebenen Arguments zurückzugeben. Und schreiben Sie das folgende Programm:

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

    @Test
    public void whenMockAnnotation() {
        Mockito.doAnswer(invocation -> {
            int parameter = invocation.getArgument(0);
            return parameter * parameter;
        }).when(mockList).get(anyInt());

        assertEquals(100, mockList.get(10));
        assertEquals(25, mockList.get(5));
    }
}

Wir haben die Funktion mithilfe eines Objekts der Answer-Klasse definiert.

Kommentare
  • Beliebt
  • Neu
  • Alt
Du musst angemeldet sein, um einen Kommentar schreiben zu können
Auf dieser Seite gibt es noch keine Kommentare