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.