3.1 metoda doReturn().
Teraz nadchodzi magia...
Załóżmy, że stworzyłeś fałszywy obiekt próbny, ale potrzebujesz go, aby jakoś działał. Kiedy wywoływano pewne metody, wykonywano coś ważnego lub metody zwracały określony wynik. Co robić?
Biblioteka Mockito umożliwia dodanie pożądanego zachowania do makiety obiektu.
Jeśli chcesz, aby symulowany obiekt zwracał określony wynik po wywołaniu określonej metody, możesz dodać tę „regułę” do obiektu za pomocą kodu:
Mockito.doReturn(result).when(an object).method name();
Widzisz, na końcu wywołania metody method name?
właściwie nie ma tu żadnego wywołania. Metoda doReturn()
zwraca specjalny obiekt proxy, za pomocą którego monitoruje wywołania metod obiektu iw ten sposób pisana jest reguła.
Ponownie. To po prostu sprytny sposób napisania reguły, która ma zostać dodana do symulowanego obiektu . Poprawna interpretacja takiego kodu w głowie wymaga pewnej wprawy, gdy go zobaczysz. Przychodzi z doświadczeniem.
Myślę, że potrzebny jest konkretny przykład. Stwórzmy próbny obiekt klasy ArrayList
i poprośmy jego metodę size()
o zwrócenie liczby 10. Cały kod będzie wyglądał następująco:
@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());
}
}
Tak, ten kod zadziała, test się nie powiedzie.
3.2 metoda when().
Istnieje inny sposób dodania reguły zachowania do symulowanego obiektu — wywołanie metody Mockito.when()
. To wygląda tak:
Mockito.when(an object.method name()).thenReturn(result);
Jest to ten sam sposób pisania reguły zachowania symulowanego obiektu, co poprzedni. Porównywać:
Mockito.doReturn(result).when(an object).method name();
Tutaj dzieje się dokładnie to samo - konstrukcja nowej reguły.
To prawda, że \u200b\u200bpierwszy przykład ma dwa minusy:
- wezwanie jest bardzo mylące.
an object.method name()
- nie zadziała, jeśli metoda
methodname()
zwrócivoid
.
Cóż, zapiszmy nasz ulubiony przykład użyciaMockito.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 Metoda doThrow().
Wymyśliliśmy, jak sprawić, by metoda symulowanego obiektu zwracała określony wynik. Jak mogę sprawić, by zgłaszał określony wyjątek? Wysłać do doReturn()
?
Aby uniemożliwić powrót metody, czyli zgłoszenie wyjątku, należy ustawić regułę za pomocą metody doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
A potem druga opcja:
Mockito.when(an object.method name()).thenThrow(exception.class);
Trochę oczekiwane, prawda?
No widzisz, już zaczynasz rozumieć. Naprawmy to na przykładzie:
@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
}
}
Jeśli potrzebujesz rzucić konkretny obiekt wyjątku, użyj konstrukcji formularza:
Mockito.doThrow(new Exception()).when(an object).method name();
Po prostu przekaż doThrow()
obiekt wyjątku do metody, a zostanie on rzucony podczas wywołania metody.