5.1 Metoden verify().
Förutom att skapa virtuella objekt uppstår ofta en annan intressant uppgift - att se till att klassen som testas anropar rätt metoder för rätt objekt. Dessutom ringde han det erforderliga antalet gånger, med rätt parametrar och liknande.
För detta har Mockito också en del magi - en familj av metoder Mockito.verify(…)
. Den allmänna regeln som specificerar metodanropskontroll är:
Mockito.verify(an object).method name(parameter);
Exempel:
@ExtendWith(MockitoExtension.class)
class VerifyTest {
@Mock
List<String> mockList;
@Test
public void whenMockAnnotation() {
//method call
String name = mockList.get(10);
// check if the method was called
Mockito.verify(mockList).get(10);
}
}
Under metodanropet verify()
sätter vi regeln att mockitoList
metoden med parametern 10 ska anropas på objektet get()
.
5.2 Metoden verify() med kontroll av antalet samtal
Ibland finns det mer komplexa verifieringsscenarier. Till exempel måste du kontrollera inte bara det faktum att metoden anropades, utan till exempel att den anropades 3 gånger. Eller så kallades det från dig i en cykel och borde därför ha hetat N gånger.
Vi kommer inte att fråga om detta kan göras, vi kommer omedelbart att fråga: hur man skriver ner en sådan regel? Och återigen, Mockito sviker oss inte. Regeln kan specificeras som:
Mockito.verify(an object,quantity).method name(parameter);
Viktig! Kvantitet är inte en typ int
, utan ett speciellt objekt som kan definiera olika mönster. Kommer du ihåg de olika versionerna av metoden any()
? Det är samma sak här - det finns speciella metoder med vilka du kan ställa in olika scenarier:
Metod | Beskrivning | |
---|---|---|
1 | aldrig() | Metoden ska aldrig kallas |
2 | gånger (n) | n gånger |
3 | åtminstone (n) | n eller fler gånger |
4 | åtminstone en gång() | 1 eller fler gånger |
5 | som mest (n) | n eller färre gånger |
6 | endast() | Det ska bara finnas ett anrop och bara till denna metod |
Exempel:
String name1 = mockList.get(1); //method call
String name2 = mockList.get(2); //method call
String name3 = mockList.get(3); //method call
//check that the get() method was called 3 times
Mockito.verify(mockList, times(3)).get(anyInt());
Du kan också kräva att, förutom de angivna metodanropen, inga andra referenser till objektet görs . Det finns en regel för detta:
Mockito.verifyNoMoreInteractions(an object);
5.3 Metod för anropsorder
De tidigare reglerna reglerade inte ordningen för anropsmetoder på något sätt. Regeln måste bara uppfyllas och det är det. Men det finns situationer när ordningen på metodanrop är viktig, och Mockito har en lösning för detta också.
En strikt ordning av metodanrop kan anges med ett speciellt objekt InOrder
. Först måste du skapa den:
InOrder inOrder = Mockito.inOrder(an object);
Och lägg sedan till regler genom att anropa metoder verify()
.
Exempel:
List<String> mockedList = mock(MyList.class);
mockedList.size();
mockedList.add("a parameter");
mockedList.clear();
InOrder inOrder = Mockito.inOrder(mockedList);
inOrder.verify(mockedList).size();
inOrder.verify(mockedList).add("a parameter");
inOrder.verify(mockedList).clear();
5.4 Kontrollera undantag i Mockito
Att undantag har slängts kontrolleras lite annorlunda. För att göra detta, använd metoden assertThrows()
. Det allmänna formatet för en sådan kontroll är:
Assertions.assertThrows(exception.class, () -> an object.methodname());
Inget komplicerat.
Exempel:
@ExtendWith(MockitoExtension.class)
class ThenThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//set the behavior of the method (needed for demonstration purposes only)
Mockito.when(mockList.size()).thenThrow(IllegalStateException.class);
//check if an IllegalStateException will be thrown when calling the size method
assertThrows(IllegalStateException.class, () -> mockList.size());
}
}
GO TO FULL VERSION