CodeGym /Java tanfolyam / /Gúnyos tárgyak

Gúnyos tárgyak

Szint , Lecke
Elérhető

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ér void.

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.

Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION