Mockito - Brug af spioner

1. Oversigt

I denne vejledning illustrerer vi, hvordan du får mest muligt ud af spioner i Mockito.

Vi vil tale om @Spion kommentar, hvordan man stubber en spion, og endelig - vi går ind på forskellen mellem Mock og Spion.

Og selvfølgelig, for mere Mockito godhed, se på serien her.

2. Enkel Spion Eksempel

Lad os starte med et simpelt eksempel på hvordan man bruger en spion.

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

Dette giver os mulighed for at kalde alle de normale metoder til objektet, mens vi stadig sporer enhver interaktion, ligesom vi ville med en mock.

OK, lad os lave et hurtigt eksempel, hvor vi spionerer på en eksisterende ArrayList objekt:

@Test offentlig ugyldig nårSpyingOnList_thenCorrect () {List list = new ArrayList (); Liste spyList = Mockito.spy (liste); spyList.add ("en"); spyList.add ("to"); Mockito.verify (spyList) .add ("one"); Mockito.verify (spyList) .add ("to"); assertEquals (2, spyList.size ()); }

Bemærk hvordan den virkelige metode tilføje() kaldes faktisk og hvordan størrelsen af spyList bliver 2.

3. Den @Spion Kommentar

Næste - lad os se, hvordan du bruger @Spion kommentar. Vi kan bruge @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 at aktivere Mockito-kommentar (såsom @Spion, @Mock, ...) - vi skal gøre et af følgende:

  • Ring til metoden MockitoAnnotations.initMocks (dette) for at initialisere annoterede felter
  • Brug den indbyggede løber @RunWith (MockitoJUnitRunner.class)

4. Stubning a Spion

Nu - Lad os se, hvordan man stubber en Spion. Vi kan konfigurere / tilsidesætte en metodes opførsel ved hjælp af den samme syntaks, som vi ville bruge med en mock.

I det følgende eksempel bruger vi doReturn () at tilsidesætte størrelse() metode:

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

5. Mock vs. Spion i Mockito

Lad os nu diskutere forskellen mellem Mock og Spion i Mockito - ikke de teoretiske forskelle mellem de to begreber, bare hvordan de adskiller sig inden for Mockito selv.

Når Mockito skaber en mock - gør den det fra Klasse af en type, ikke fra en faktisk forekomst. Mocken skaber simpelthen en skallenhed med bare knogler af klassen, helt instrumenteret til at spore interaktioner med den.

På den anden side, spionen indpakker en eksisterende instans. Det vil stadig opføre sig på samme måde som den normale forekomst - den eneste forskel er, at det også vil være instrumenteret til at spore alle interaktioner med det.

I det følgende eksempel opretter vi en spotte af 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 - tilføjelse af et element til den spottede liste tilføjer faktisk ikke noget - det kalder bare metoden uden nogen anden bivirkning.

En spion på den anden side vil opføre sig anderledes - det vil faktisk kalde den virkelige implementering af tilføje metode og tilføj elementet til den underliggende liste:

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

6. Forståelse af Mockito NotAMockException

I dette sidste afsnit lærer vi om Mockito NotAMockException. Denne undtagelse er en af ​​de almindelige undtagelser, som vi sandsynligvis vil støde på, når vi misbruger mocks eller spioner.

Lad os starte med at se, under hvilke omstændigheder denne undtagelse kan forekomme:

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

Når vi kører dette kodestykke, får vi følgende fejl:

org.mockito.exceptions.misusing.NotAMockException: Argument videregivet til når () ikke er en mock! Eksempel på korrekt stubbing: doThrow (ny RuntimeException ()). Når (mock) .someMethod (); 

Heldigvis er det helt klart fra Mockito-fejlmeddelelsen, hvad problemet er her. I vores eksempel er liste objekt er ikke en mock. Mockito hvornår() metoden forventer en mock eller spion objekt som argumentet.

Som vi også kan se, beskriver undtagelsesmeddelelsen endda, hvordan en korrekt påkaldelse skal se ud. Nu hvor vi har en bedre forståelse af, hvad problemet er, lad os rette det efter anbefalingen:

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

Vores eksempel opfører sig nu som forventet, og vi ser ikke længere Mockito NotAMockException.

7. Konklusion

I denne hurtige artikel diskuterede vi de mest nyttige eksempler på brug af Mockito-spioner.

Vi lærte at skabe en spion, hvordan man bruger @Spion kommentar, hvordan man stubber en spion og endelig - forskellen mellem Mock og Spion.

Implementeringen af ​​alle disse eksempler kan findes på GitHub.

Dette er et Maven-projekt, så det skal være let at importere og køre som det er.

Og selvfølgelig, for mere Mockito godhed, se på serien her.