3.1 doReturn() metode
Nu kommer magien...
Lad os sige, at du har oprettet et falsk falsk objekt, men du har brug for det til at fungere på en eller anden måde. Når bestemte metoder blev kaldt, blev der gjort noget vigtigt, eller metoderne gav et bestemt resultat. Hvad skal man gøre?
Mockito-biblioteket giver dig mulighed for at tilføje den ønskede adfærd til et falsk objekt.
Hvis du vil have et mock objekt til at returnere et bestemt resultat, når en bestemt metode kaldes, så kan denne "regel" tilføjes til objektet ved hjælp af koden:
Mockito.doReturn(result).when(an object).method name();
Ser du, i slutningen af metodekaldet method name?
er der faktisk ikke noget opkald i gang her. Metoden doReturn()
returnerer et særligt proxy-objekt, ved hjælp af hvilket den overvåger kaldene af objektets metoder, og reglen bliver således skrevet.
En gang til. Det er bare sådan en smart måde at skrive en regel, der skal tilføjes til et falsk objekt . Det kræver nogle færdigheder at fortolke en sådan kode korrekt i dit hoved, når du ser den. Kommer med erfaring.
Jeg tror, der er brug for et konkret eksempel. Lad os oprette et mock klasseobjekt ArrayList
og bede dets metode size()
om at returnere tallet 10. Den komplette kode vil se sådan ud:
@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());
}
}
Ja, denne kode vil virke, testen vil ikke mislykkes.
3.2 when() metode
Der er en anden måde at tilføje en adfærdsregel til et falsk objekt - ved at kalde Mockito.when()
. Det ser sådan ud:
Mockito.when(an object.method name()).thenReturn(result);
Dette er den samme måde at skrive en falsk objektadfærdsregel på som den forrige. Sammenligne:
Mockito.doReturn(result).when(an object).method name();
Her sker præcis det samme - konstruktionen af en ny regel.
Sandt nok har det første eksempel to minusser:
- opkaldet er meget forvirrende.
an object.method name()
- vil ikke fungere, hvis metoden
methodname()
vender tilbagevoid
.
Nå, lad os nedskrive vores foretrukne eksempel ved hjælp afMockito.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 doThrow() metode
Vi fandt ud af, hvordan man får en mock-objektmetode til at returnere et specifikt resultat. Hvordan kan jeg få det til at kaste en specifik undtagelse? sende det til doReturn()
?
For at forhindre metoden i at returnere, nemlig at kaste en undtagelse, skal du indstille reglen ved hjælp af doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
Og så den anden mulighed:
Mockito.when(an object.method name()).thenThrow(exception.class);
Lidt forventet, ikke?
Nå, ser du, du begynder allerede at forstå. Lad os rette det med et eksempel:
@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
}
}
Hvis du har brug for at smide et specifikt undtagelsesobjekt, så brug konstruktionen af formularen:
Mockito.doThrow(new Exception()).when(an object).method name();
Bare send doThrow()
et undtagelsesobjekt til metoden, og det vil blive kastet under metodekaldet.