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.