3.1 doReturn()-metoden
Nå kommer magien...
La oss si at du har laget et falskt falskt objekt, men du trenger det for å fungere på en eller annen måte. Når bestemte metoder ble kalt, ble noe viktig gjort, eller metodene ga et bestemt resultat. Hva å gjøre?
Mockito-biblioteket lar deg legge til ønsket oppførsel til et falskt objekt.
Hvis du vil at et falskt objekt skal returnere et bestemt resultat når en bestemt metode kalles, kan denne "regelen" legges til objektet ved å bruke koden:
Mockito.doReturn(result).when(an object).method name();
Du skjønner, på slutten av metodeanropet method name?
er det faktisk ingen samtale på gang her. Metoden doReturn()
returnerer et spesielt proxy-objekt ved hjelp av hvilket den overvåker kallene til objektets metoder, og dermed blir regelen skrevet.
En gang til. Det er bare en så smart måte å skrive en regel for å legge til et falskt objekt . Det krever litt ferdighet å tolke en slik kode riktig i hodet når du ser den. Kommer med erfaring.
Jeg tror det trengs et konkret eksempel. La oss lage et mock klasseobjekt ArrayList
og spørre metoden size()
om å returnere tallet 10. Den komplette koden vil se slik ut:
@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 koden vil fungere, testen vil ikke mislykkes.
3.2 when()-metoden
Det er en annen måte å legge til en atferdsregel til et falskt objekt - ved å kalle Mockito.when()
. Det ser slik ut:
Mockito.when(an object.method name()).thenReturn(result);
Dette er den samme måten å skrive en falsk objektadferdsregel som den forrige. Sammenligne:
Mockito.doReturn(result).when(an object).method name();
Her skjer akkurat det samme - konstruksjonen av en ny regel.
Riktignok har det første eksemplet to minuser:
- samtalen er veldig forvirrende.
an object.method name()
- vil ikke fungere hvis metoden
methodname()
kommer tilbakevoid
.
Vel, la oss skrive ned favoritteksemplet vårt ved å brukeMockito.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()-metoden
Vi fant ut hvordan man får en falsk objektmetode til å returnere et spesifikt resultat. Hvordan kan jeg få det til å gi et spesifikt unntak? sende den til doReturn()
?
For å forhindre at metoden returnerer, nemlig å kaste et unntak, må du angi regelen med doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
Og så det andre alternativet:
Mockito.when(an object.method name()).thenThrow(exception.class);
Litt forventet, ikke sant?
Vel, du skjønner, du begynner allerede å forstå. La oss fikse 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 trenger å kaste et spesifikt unntaksobjekt, bruk konstruksjonen av skjemaet:
Mockito.doThrow(new Exception()).when(an object).method name();
Bare send doThrow()
et unntaksobjekt til metoden, og det vil bli kastet under metodekallet.