Mockito - Používanie špiónov

1. Prehľad

V tomto výučbe si ukážeme, ako čo najlepšie využiť špehovia v Mockito.

Budeme hovoriť o @ Spy anotácia, ako strčiť špióna a nakoniec - pôjdeme do rozdielu medzi Mock a Špión.

A samozrejme, pre viac dobrôt Mockito, sa pozrite na sériu tu.

2. Jednoduché Špión Príklad

Začnime jednoduchým príkladom ako používať a špión.

Jednoducho povedané, API je Mockito.spy () - do špehovať skutočný predmet.

To nám umožní zavolať všetky bežné metódy objektu a zároveň sledovať každú interakciu, ako by sme to robili s predstieraním.

Dobre, urobme si krátky príklad, keď špehujeme existujúce ArrayList objekt:

@Test public void whenSpyingOnList_thenCorrect () {List list = new ArrayList (); Zoznam spyList = Mockito.spy (zoznam); spyList.add ("jeden"); spyList.add ("dva"); Mockito.verify (spyList) .add ("jeden"); Mockito.verify (spyList) .add ("dva"); assertEquals (2, spyList.size ()); }

Všimnite si ako skutočná metóda pridať () sa skutočne volá a ako veľkosť spyList sa stáva 2.

3. The @ Spy Anotácia

Ďalej - pozrime sa, ako používať @ Spy anotácia. Môžeme použiť @ Spy anotácia namiesto špión () ako v nasledujúcom príklade:

@Spy List spyList = nový ArrayList (); @Test public void whenUsingTheSpyAnnotation_thenObjectIsSpied () {spyList.add ("one"); spyList.add ("dva"); Mockito.verify (spyList) .add ("jeden"); Mockito.verify (spyList) .add ("dva"); assertEquals (2, spyList.size ()); }

Za účelom povoliť anotáciu Mockito (ako napr @ Spy, @Mock, ...) - musíme urobiť jeden z nasledujúcich krokov:

  • Zavolajte metódu MockitoAnnotations.initMocks (toto) inicializovať anotované polia
  • Použite vstavaný bežec @RunWith (MockitoJUnitRunner.class)

4. Bodnutie a Špión

Teraz - Pozrime sa, ako prepichnúť a Špión. Chovanie metódy môžeme konfigurovať / prepísať pomocou rovnakej syntaxe, akú by sme použili pri falošnom testovaní.

V nasledujúcom príklade - používame doReturn () prepísať veľkosť () metóda:

@ Test public void whenStubASpy_thenStubbed () {List list = new ArrayList (); Zoznam spyList = Mockito.spy (zoznam); assertEquals (0, spyList.size ()); Mockito.doReturn (100) .when (spyList) .size (); assertEquals (100, spyList.size ()); }

5. Mock vs. Špión v Mockito

Teraz - poďme diskutovať o rozdiele medzi Mock a Špión v Mockito - nie teoretické rozdiely medzi týmito dvoma konceptmi, len to, ako sa líšia v rámci samotného Mockita.

Keď Mockito vytvorí falošnú ukážku - urobí to z Trieda typu, nie od skutočnej inštancie. Faloš jednoducho vytvorí inštancia holých kostí triedy, ktorý je úplne vybavený na sledovanie interakcií s ním.

Na druhej strane, špión zabalí existujúcu inštanciu. Stále sa bude správať rovnako ako normálna inštancia - jediný rozdiel je, že bude tiež prístrojom na sledovanie všetkých interakcií s ním.

V nasledujúcom príklade - vytvoríme a predstierať z ArrayList trieda:

@Test public void whenCreateMock_thenCreated () {List mockedList = Mockito.mock (ArrayList.class); mockedList.add ("jeden"); Mockito.verify (mockedList) .add ("one"); assertEquals (0, mockedList.size ()); }

Ako vidíme - pridanie prvku do vysmievaného zoznamu v skutočnosti nepridáva nič - iba zavolá metódu bez ďalších vedľajších účinkov.

Špión sa na druhej strane bude správať inak - v skutočnosti bude nazývať skutočnú implementáciu pridať a pridajte prvok do základného zoznamu:

@Test public void whenCreateSpy_thenCreate () {List spyList = Mockito.spy (new ArrayList ()); spyList.add ("jeden"); Mockito.verify (spyList) .add ("jeden"); assertEquals (1, spyList.size ()); }

6. Pochopenie Mockita NotAMockException

V tejto poslednej časti sa dozvieme niečo o Mockite NotAMockException. Táto výnimka je jednou z bežných výnimiek, s ktorými sa pravdepodobne stretneme pri zneužívaní falošných alebo špiónskych správ.

Začnime tým, za akých okolností sa táto výnimka môže vyskytnúť:

Zoznam zoznam = nový ArrayList (); Mockito.doReturn (100) .when (list) .size (); assertEquals ("Veľkosť by mala byť 100:", 100, list.size ()); 

Po spustení tohto útržku kódu sa zobrazí nasledujúca chyba:

org.mockito.exceptions.misusing.NotAMockException: Argument pass to when () is not a mock! Príklad správneho stubbing: doThrow (new RuntimeException ()). When (mock) .someMethod (); 

Z chybovej správy Mockito je našťastie úplne zrejmé, v čom je problém. V našom príklade zoznam objekt nie je falošný. Mockito kedy() metóda očakáva ako argument falošný alebo špionážny objekt.

Ako tiež vidíme, správa o výnimke dokonca popisuje, ako by malo správne vyvolanie vyzerať. Teraz, keď už lepšie chápeme, v čom je problém, opravme ho podľa odporúčania:

konečný zoznam spyList = Mockito.spy (nový ArrayList ()); Mockito.doReturn (100) .when (spyList) .size (); assertEquals ("Veľkosť by mala byť 100:", 100, spyList.size ()); 

Náš príklad sa teraz správa podľa očakávania a my už Mockita nevidíme NotAMockException.

7. Záver

V tomto rýchlom článku sme si povedali najužitočnejšie príklady použitia špiónov Mockito.

Naučili sme sa, ako vytvoriť špión, ako použiť @ Spy anotácia, ako zapnúť a špión a nakoniec - rozdiel medzi Mock a Špión.

Implementácia všetkých týchto príkladov nájdete na GitHub.

Toto je projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.

A samozrejme, pre viac dobrôt Mockito, sa pozrite na sériu tu.


$config[zx-auto] not found$config[zx-overlay] not found