3.1 doReturn()-metoden
Nu kommer magin...
Låt oss säga att du skapade ett falskt skenobjekt, men du behöver det för att fungera på något sätt. När vissa metoder anropades gjordes något viktigt, eller så gav metoderna ett visst resultat. Vad ska man göra?
Mockito-biblioteket låter dig lägga till önskat beteende till ett skenobjekt.
Om du vill att ett skenobjekt ska returnera ett visst resultat när en viss metod anropas, kan denna "regel" läggas till objektet med hjälp av koden:
Mockito.doReturn(result).when(an object).method name();
Du förstår, i slutet av metodanropet method name?
finns det faktiskt inget samtal här. Metoden doReturn()
returnerar ett speciellt proxyobjekt med hjälp av vilket den övervakar anropen av objektets metoder och på så sätt skrivs regeln.
Igen. Det är bara ett så smart sätt att skriva en regel som ska läggas till i ett skenobjekt . Det krävs viss skicklighet för att korrekt tolka sådan kod i ditt huvud när du ser den. Kommer med erfarenhet.
Jag tror att det behövs ett konkret exempel. Låt oss skapa ett mock-klassobjekt ArrayList
och be dess metod size()
att returnera siffran 10. Hela koden kommer att se ut så här:
@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, den här koden kommer att fungera, testet kommer inte att misslyckas.
3.2 metoden when().
Det finns ett annat sätt att lägga till en beteenderegel till ett skenobjekt - genom att anropa Mockito.when()
. Det ser ut så här:
Mockito.when(an object.method name()).thenReturn(result);
Detta är samma sätt att skriva en skenobjekt beteenderegel som den föregående. Jämföra:
Mockito.doReturn(result).when(an object).method name();
Här händer exakt samma sak - konstruktionen av en ny regel.
Det är sant att det första exemplet har två minus:
- samtalet är mycket förvirrande.
an object.method name()
- kommer inte att fungera om metoden
methodname()
återkommervoid
.
Nåväl, låt oss skriva ner vårt favoritexempel med hjälp avMockito.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 kom på hur man får en skenobjektmetod att returnera ett specifikt resultat. Hur kan jag få det att skapa ett specifikt undantag? Skicka den till doReturn()
?
För att förhindra att metoden återkommer, nämligen att göra ett undantag, måste du ställa in regeln med hjälp av doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
Och sedan det andra alternativet:
Mockito.when(an object.method name()).thenThrow(exception.class);
Lite väntat, eller hur?
Ja, du förstår, du börjar redan förstå. Låt oss fixa det med ett exempel:
@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
}
}
Om du behöver kasta ett specifikt undantagsobjekt, använd sedan konstruktionen av formuläret:
Mockito.doThrow(new Exception()).when(an object).method name();
Skicka bara doThrow()
ett undantagsobjekt till metoden och det kommer att kastas under metodanropet.