3.1 doReturn()-methode
Nu komt de magie...
Laten we zeggen dat je een nep nep-object hebt gemaakt, maar je hebt het op de een of andere manier nodig om te werken. Wanneer bepaalde methoden werden aangeroepen, werd er iets belangrijks gedaan of gaven de methoden een bepaald resultaat terug. Wat moeten we doen?
Met de Mockito-bibliotheek kunt u het gewenste gedrag aan een mock-object toevoegen.
Als je wilt dat een mock-object een bepaald resultaat retourneert wanneer een bepaalde methode wordt aangeroepen, dan kan deze "regel" aan het object worden toegevoegd met behulp van de code:
Mockito.doReturn(result).when(an object).method name();
Zie je, aan het einde van de methodeaanroep method name?
is er hier eigenlijk geen aanroep. De methode doReturn()
retourneert een speciaal proxy-object met behulp waarvan het de aanroepen van de methoden van het object controleert en dus wordt de regel geschreven.
Opnieuw. Het is zo'n slimme manier om een regel te schrijven om toe te voegen aan een nagemaakt object . Er is enige vaardigheid voor nodig om dergelijke code in je hoofd correct te interpreteren wanneer je deze ziet. Komt met ervaring.
Ik denk dat een concreet voorbeeld nodig is. Laten we een mock class-object maken ArrayList
en zijn methode vragen size()
om het getal 10 te retourneren. De volledige code ziet er als volgt uit:
@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, deze code zal werken, de test zal niet mislukken.
3.2 when() methode
Er is een andere manier om een gedragsregel toe te voegen aan een nagemaakt object: door de Mockito.when()
. Het ziet er zo uit:
Mockito.when(an object.method name()).thenReturn(result);
Dit is dezelfde manier om een nep-objectgedragsregel te schrijven als de vorige. Vergelijken:
Mockito.doReturn(result).when(an object).method name();
Hier gebeurt precies hetzelfde - de constructie van een nieuwe regel.
Toegegeven, het eerste voorbeeld heeft twee minnen:
- de oproep is erg verwarrend.
an object.method name()
- werkt niet als de methode
methodname()
terugkeertvoid
.
Laten we ons favoriete voorbeeld opschrijven met behulp vanMockito.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()-methode
We hebben ontdekt hoe we een mock-objectmethode een specifiek resultaat kunnen laten retourneren. Hoe kan ik ervoor zorgen dat het een specifieke uitzondering genereert? Stuur het naar doReturn()
?
Om te voorkomen dat de methode terugkeert, namelijk het genereren van een uitzondering, moet u de regel instellen met behulp van de doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
En dan de tweede optie:
Mockito.when(an object.method name()).thenThrow(exception.class);
Een beetje verwacht, toch?
Nou, zie je, je begint het al te begrijpen. Laten we het oplossen met een voorbeeld:
@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
}
}
Als u een specifiek uitzonderingsobject moet gooien, gebruik dan de constructie van het formulier:
Mockito.doThrow(new Exception()).when(an object).method name();
Geef gewoon doThrow()
een uitzonderingsobject door aan de methode en het wordt gegenereerd tijdens de methodeaanroep.
GO TO FULL VERSION