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.