3.1 doReturn() metódus
Most jön a varázslat...
Tegyük fel, hogy létrehozott egy hamis álobjektumot, de szüksége van rá, hogy valahogy működjön. Amikor bizonyos módszereket meghívtak, valami fontosat tettek, vagy a metódusok bizonyos eredményt adtak vissza. Mit kell tenni?
A Mockito könyvtár lehetővé teszi, hogy a kívánt viselkedést hozzáadja egy hamis objektumhoz.
Ha azt szeretné, hogy egy álobjektum egy bizonyos eredményt adjon vissza egy bizonyos metódus meghívásakor, akkor ez a „szabály” hozzáadható az objektumhoz a kód segítségével:
Mockito.doReturn(result).when(an object).method name();
Látod, a metódushívás végén method name?
itt valójában nincs hívás. A metódus doReturn()
egy speciális proxy-objektumot ad vissza, melynek segítségével figyeli az objektum metódusainak hívását, és így íródik a szabály.
Újra. Ez egy olyan okos módja annak, hogy szabályt írjunk egy hamis objektumhoz . Kell némi készség ahhoz, hogy helyesen értelmezze az ilyen kódot a fejében, amikor látja. Tapasztalattal jön.
Szerintem konkrét példa kell. Hozzunk létre egy hamis osztályobjektumot ArrayList
, és kérjük meg a metódusát size()
, hogy adja vissza a 10-es számot. A teljes kód így fog kinézni:
@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());
}
}
Igen, ez a kód működni fog, a teszt nem sikerül.
3.2 when() metódus
Van egy másik módja annak, hogy viselkedési szabályt adjunk hozzá egy hamis objektumhoz - a Mockito.when()
. Ez így néz ki:
Mockito.when(an object.method name()).thenReturn(result);
Ez ugyanaz a mód az objektum viselkedési szabály megírására, mint az előző. Összehasonlítás:
Mockito.doReturn(result).when(an object).method name();
Itt pontosan ugyanaz történik - egy új szabály felépítése.
Igaz, az első példának két hátránya van:
- a hívás nagyon zavaró.
an object.method name()
- nem fog működni, ha a metódus
methodname()
visszatérvoid
.
Nos, írjuk le kedvenc példánkat a használatávalMockito.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() metódus
Kitaláltuk, hogyan lehet egy álobjektum metódussal konkrét eredményt adni. Hogyan tehetek róla, hogy konkrét kivételt tegyen? Küldje el doReturn()
?
Annak megakadályozása érdekében, hogy a metódus visszatérjen, nevezetesen kivételt dobjon, be kell állítania a szabályt a doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
És akkor a második lehetőség:
Mockito.when(an object.method name()).thenThrow(exception.class);
Kicsit várható, nem?
Nos, látod, már kezded érteni. Javítsuk ki egy példával:
@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
}
}
Ha egy adott kivételobjektumot kell dobnia, használja az űrlap felépítését:
Mockito.doThrow(new Exception()).when(an object).method name();
Csak adjon át doThrow()
egy kivételobjektumot a metódusnak, és a rendszer a metódushívás során dobja ki.