Mockito - Bruke spioner

1. Oversikt

I denne opplæringen vil vi illustrere hvordan du får mest mulig ut av spioner i Mockito.

Vi skal snakke om @Spion kommentar, hvordan stubbe en spion, og til slutt - vi vil gå inn på forskjellen mellom håne og Spion.

Og selvfølgelig, for mer Mockito godhet, ta en titt på serien her.

2. Enkelt Spion Eksempel

La oss starte med et enkelt eksempel på hvordan du bruker en spion.

Enkelt sagt, API er Mockito.spy () - til spionere på et ekte objekt.

Dette vil tillate oss å ringe til alle normale metoder for objektet mens vi fremdeles sporer hver interaksjon, akkurat som vi ville gjort med en hån.

OK, la oss gjøre et raskt eksempel der vi vil spionere på en eksisterende ArrayList gjenstand:

@Test public void whenSpyingOnList_thenCorrect () {List list = new ArrayList (); List spyList = Mockito.spy (liste); spyList.add ("en"); spyList.add ("to"); Mockito.verify (spyList) .add ("one"); Mockito.verify (spyList) .add ("to"); assertEquals (2, spyList.size ()); }

Legg merke til hvordan den virkelige metoden legge til() heter faktisk og hvordan størrelsen på spyList blir 2.

3. Den @Spion Kommentar

Neste - la oss se hvordan du bruker @Spion kommentar. Vi kan bruke @Spion kommentar i stedet for spion() som i følgende eksempel:

@Spy List spyList = ny ArrayList (); @Test offentlig ugyldig nårUsingTheSpyAnnotation_thenObjectIsSpied () {spyList.add ("one"); spyList.add ("to"); Mockito.verify (spyList) .add ("one"); Mockito.verify (spyList) .add ("to"); assertEquals (2, spyList.size ()); }

For å aktivere Mockito-merknader (som for eksempel @Spion, @Håne, ...) - vi må gjøre ett av følgende:

  • Ring metoden MockitoAnnotations.initMocks (dette) for å initialisere merkede felt
  • Bruk den innebygde løperen @RunWith (MockitoJUnitRunner.class)

4. Stubbing a Spion

Nå - La oss se hvordan du stubber a Spion. Vi kan konfigurere / overstyre oppførselen til en metode ved hjelp av samme syntaks som vi ville brukt med en mock.

I det følgende eksemplet - bruker vi doReturn () å overstyre størrelse() metode:

@Test offentlig ugyldig nårStubASpy_thenStubbed () {List list = new ArrayList (); List spyList = Mockito.spy (liste); assertEquals (0, spyList.size ()); Mockito.doReturn (100) .when (spyList) .størrelse (); assertEquals (100, spyList.size ()); }

5. håne vs. Spionere i Mockito

La oss nå diskutere forskjellen mellom håne og Spion i Mockito - ikke de teoretiske forskjellene mellom de to begrepene, bare hvordan de adskiller seg innenfor Mockito selv.

Når Mockito lager en mock - gjør den det fra Klasse av en type, ikke fra en faktisk forekomst. Hånen skaper rett og slett en skallinstans med bare bein av klassen, helt instrumentert for å spore interaksjoner med den.

På den andre siden, spionen vil pakke inn en eksisterende forekomst. Det vil fremdeles oppføre seg på samme måte som den normale forekomsten - den eneste forskjellen er at den også vil være instrumentert for å spore alle interaksjoner med den.

I det følgende eksemplet - lager vi en håne av ArrayList klasse:

@Test offentlig ugyldig nårCreateMock_thenCreated () {List mockedList = Mockito.mock (ArrayList.class); mockedList.add ("en"); Mockito.verify (mockedList) .add ("one"); assertEquals (0, mockedList.size ()); }

Som vi kan se - å legge til et element i den hånede listen, legger faktisk ikke til noe - det kaller bare metoden uten noen annen bivirkning.

En spion derimot vil oppføre seg annerledes - den vil faktisk kalle den virkelige implementeringen av legge til metode og legg til elementet i den underliggende listen:

@Test offentlig ugyldig nårCreateSpy_thenCreate () {List spyList = Mockito.spy (new ArrayList ()); spyList.add ("en"); Mockito.verify (spyList) .add ("one"); assertEquals (1, spyList.size ()); }

6. Forstå Mockito NotAMockException

I denne siste delen vil vi lære om Mockito NotAMockException. Dette unntaket er et av de vanligste unntakene vi sannsynligvis vil støte på når vi bruker misbruk eller spioner.

La oss starte med å se under hvilke omstendigheter dette unntaket kan oppstå:

Listeliste = ny ArrayList (); Mockito.doReturn (100). Når (liste) .størrelse (); assertEquals ("Størrelsen skal være 100:", 100, list.size ()); 

Når vi kjører denne kodebiten, får vi følgende feil:

org.mockito.exceptions.misusing.NotAMockException: Argumentet overføres til når () ikke er et narr! Eksempel på riktig stubbing: doThrow (ny RuntimeException ()). Når (mock) .someMethod (); 

Heldigvis er det ganske klart fra Mockito-feilmeldingen hva problemet er her. I vårt eksempel, den liste objekt er ikke en hån. Mockito når() metoden forventer et spott- eller spionobjekt som argument.

Som vi også kan se, beskriver unntaksmeldingen til og med hvordan en korrekt påkalling skal se ut. Nå som vi har bedre forståelse av hva problemet er, la oss fikse det i henhold til anbefalingen:

endelig liste spyList = Mockito.spy (ny ArrayList ()); Mockito.doReturn (100) .when (spyList) .størrelse (); assertEquals ("Størrelsen skal være 100:", 100, spyList.size ()); 

Eksemplet vårt oppfører seg nå som forventet, og vi ser ikke lenger Mockito NotAMockException.

7. Konklusjon

I denne raske artikkelen diskuterte vi de mest nyttige eksemplene på bruk av Mockito-spioner.

Vi lærte å lage en spion, hvordan å bruke @Spion kommentar, hvordan stubbe en spion og til slutt - forskjellen mellom håne og Spion.

Implementeringen av alle disse eksemplene kan du finne på GitHub.

Dette er et Maven-prosjekt, så det skal være enkelt å importere og kjøre som det er.

Og selvfølgelig, for mer Mockito godhet, ta en titt på serien her.