Mockito - Korištenje špijuna
1. Pregled
U ovom uputstvu ilustrirat ćemo kako najbolje iskoristiti špijuni u Mockitu.
Razgovarat ćemo o @Špijun napomena, kako omamiti špijuna i, konačno - ući ćemo u razliku između Oponašanje i Špijun.
I naravno, za više Mockito dobrote, pogledajte seriju ovdje.
2. Jednostavno Špijun Primjer
Počnimo s jednostavnim primjerom kako koristiti a špijun.
Jednostavno rečeno, API je Mockito.spy () - do špijunira stvarni objekt.
To će nam omogućiti da pozovemo sve uobičajene metode objekta, a da istovremeno pratimo svaku interakciju, baš kao što bismo to učinili i s lažnom.
U redu, napravimo brzi primjer gdje ćemo špijunirati postojeće ArrayList objekt:
@Test public void whenSpyingOnList_thenCorrect () {Lista popisa = novi ArrayList (); Popis spyList = Mockito.spy (popis); spyList.add ("jedan"); spyList.add ("dva"); Mockito.verify (spyList) .add ("jedan"); Mockito.verify (spyList) .add ("dva"); assertEquals (2, spyList.size ()); }
Imajte na umu kako prava metoda dodati() zapravo se zove i kako veličina špijunska lista postaje 2.
3. The @Špijun Bilješka
Dalje - da vidimo kako koristiti @Špijun bilješka. Možemo koristiti @Špijun bilješka umjesto špijun() kao u sljedećem primjeru:
@ Špijunski popis spyList = novi ArrayList (); @Test public void whenUsingTheSpyAnnotation_thenObjectIsSpied () {spyList.add ("one"); spyList.add ("dva"); Mockito.verify (spyList) .add ("jedan"); Mockito.verify (spyList) .add ("dva"); assertEquals (2, spyList.size ()); }
Da bi omogućiti Mockito bilješke (kao što je @Špijun, @Oponašanje, ...) - moramo učiniti jedno od sljedećeg:
- Pozovite metodu MockitoAnnotations.initMocks (ovo) za inicijalizaciju označenih polja
- Upotrijebite ugrađeni trkač @RunWith (MockitoJUnitRunner.class)
4. Stubanje a Špijun
A sada - Da vidimo kako ugušiti a Špijun. Možemo konfigurirati / nadjačati ponašanje metode koristeći istu sintaksu koju bismo koristili s mockom.
U sljedećem primjeru - koristimo doReturn () nadjačati veličina() metoda:
@Test public void whenStubASpy_thenStubbed () {Popis popisa = novi ArrayList (); Popis spyList = Mockito.spy (popis); assertEquals (0, spyList.size ()); Mockito.doReturn (100) .when (spyList) .size (); assertEquals (100, spyList.size ()); }
5. Oponašanje nasuprot Špijun u Mockitu
Sada - razgovarajmo o razlici između Oponašanje i Špijun u Mockitu - ne teorijske razlike između dva koncepta, već samo kako se razlikuju unutar samog Mockita.
Kad Mockito stvara podsmijeh - to čini iz Razred tipa, a ne iz stvarne instance. Ismijavanje jednostavno stvara primjer školjke golih kostiju razreda, u potpunosti instrumentiran za praćenje interakcija s njim.
S druge strane, špijun će omotati postojeću instancu. I dalje će se ponašati na isti način kao i normalna instanca - jedina je razlika što će također biti instrumentiran za praćenje svih interakcija s njim.
U sljedećem primjeru - kreiramo oponašanje od ArrayList razred:
@Test public void whenCreateMock_thenCreated () {Popis mockedList = Mockito.mock (ArrayList.class); mockedList.add ("jedan"); Mockito.verify (mockedList) .add ("jedan"); assertEquals (0, mockedList.size ()); }
Kao što vidimo - dodavanje elementa na ismijani popis zapravo ne dodaje ništa - samo poziva metodu bez drugih nuspojava.
S druge strane, špijun će se ponašati drugačije - zapravo će nazvati stvarnu provedbu dodati metodu i dodajte element na temeljni popis:
@Test public void whenCreateSpy_thenCreate () {List spyList = Mockito.spy (new ArrayList ()); spyList.add ("jedan"); Mockito.verify (spyList) .add ("jedan"); assertEquals (1, spyList.size ()); }
6. Razumijevanje Mockita NotAMockException
U ovom posljednjem odjeljku saznat ćemo o Mockitu NotAMockException. Ova je iznimka jedna od uobičajenih iznimki s kojima ćemo se vjerojatno susresti prilikom zlouporabe lažnih ili špijunskih usluga.
Krenimo od toga da vidimo pod kojim okolnostima se ova iznimka može dogoditi:
Lista popisa = novi ArrayList (); Mockito.doReturn (100) .when (list) .size (); assertEquals ("Veličina bi trebala biti 100:", 100, list.size ());
Kada pokrenemo ovaj isječak koda, dobit ćemo sljedeću pogrešku:
org.mockito.exceptions.misusing.NotAMockException: Argument proslijeđen kada () nije izrugivanje! Primjer ispravnog zagrižavanja: doThrow (novi RuntimeException ()). When (mock) .someMethod ();
Srećom iz poruke o pogrešci Mockito sasvim je jasno u čemu je problem. U našem primjeru, popis objekt nije ruglo. Mockito kada() metoda očekuje lažni ili špijunski objekt kao argument.
Kao što također možemo vidjeti, poruka o iznimci čak opisuje kako bi trebao izgledati ispravan poziv. Sad kad bolje razumijemo u čemu je problem, popravimo ga slijedeći preporuku:
konačni popis spyList = Mockito.spy (novi ArrayList ()); Mockito.doReturn (100) .when (spyList) .size (); assertEquals ("Veličina bi trebala biti 100:", 100, spyList.size ());
Naš se primjer sada ponaša očekivano i više ne vidimo Mockito NotAMockException.
7. Zaključak
U ovom kratkom članku raspravljali smo o najkorisnijim primjerima upotrebe Mockito špijuna.
Naučili smo kako stvoriti špijun, kako koristiti @Špijun napomena, kako natapati a špijun i, konačno - razlika između Oponašanje i Špijun.
Provedba svih ovih primjera možete pronaći na GitHubu.
Ovo je Maven projekt, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.
I naravno, za više Mockito dobrote, pogledajte seriju ovdje.