Mockito ArgumentMatchers

1. Oversikt

Denne opplæringen viser hvordan du bruker ArgumentMatcher og hvordan det skiller seg fra ArgumentCaptor.

For en introduksjon til Mockito-rammeverket, se denne artikkelen.

2. Maven-avhengigheter

Vi må legge til en enkelt gjenstand:

 org.mockito mockito-core 2.21.0 test 

Den siste versjonen av Mockito finner du på Maven Central.

3. ArgumentMatchers

Det er mulig å konfigurere en hånet metode på forskjellige måter. En av dem er å returnere faste verdier:

doReturn ("Flower"). når (flowerService) .analyse ("valmue");

I eksemplet ovenfor er String “Blomst” returneres bare når analysetjenesten mottar String “Valmue”.

Men kanskje vi må svare på et bredere spekter av verdier eller på forhånd ukjente verdier.

I alle disse scenariene, vi kan konfigurere spottede metoder med argumentmatchere:

når (flowerService.analyze (anyString ())). deretterReturn ("Flower");

Nå, på grunn av anyString argument matcher, blir resultatet det samme uansett hvilken verdi vi gir for å analysere. ArgumentMatchers tillater oss fleksibel verifisering eller stubbing.

I tilfelle en metode har mer enn ett argument, det er ikke mulig å bruke ArgumentMatchers for bare noen av argumentene. Mockito krever at du oppgir alle argumenter enten av matchere eller etter eksakte verdier.

Et neste eksempel er en feil tilnærming til dette:

abstrakt klasse FlowerService {offentlig abstrakt boolsk isABigFlower (strengnavn, int petals); } FlowerService-mock = mock (FlowerService.class); når (mock.isABigFlower ("valmue", anyInt ())). deretterReturn (true);

For å fikse det og beholde String navnet “valmue” som ønsket, vil vi bruke eq matcher:

når (mock.isABigFlower (eq ("valmue"), anyInt ()). thenReturn (true);

Det er to punkter å ta vare på når matchere er brukt:

  • Vi kan ikke bruke dem som en returverdi, kreves en nøyaktig verdi når du stikker anrop
  • Endelig, vi kan ikke bruke argument matchere utenfor verifisering eller stubbing

I det siste tilfellet, Mockito vil oppdage feilplassert argument og kaste et InvalidUseOfMatchersException.

Et dårlig eksempel kan være:

String orMatcher = eller (eq ("valmue"), slutter med ("y")); verifisere (mock) .analyse (eller Matcher);

Måten å implementere ovennevnte kode på er:

verifisere (mock) .analyse (eller (eq ("valmue"), slutter med ("y")));

Mockito gir også AdditionalMatchers å implementere vanlige logiske operasjoner (‘ikke’, ‘og’, ‘eller’) på ArgumentMatchers som samsvarer med både primitive og ikke-primitive typer:

verifisere (mock) .analyse (eller (eq ("valmue"), slutter med ("y")));

4. Egendefinert argumentmatcher

Å skape våre matcher kan være bra å velge en best mulig tilnærming for et gitt scenario og produsere test av høyeste kvalitet, som er rent og vedlikeholdbart.

For eksempel kan vi ha en MessageController som leverer meldinger. Den får en MessageDTO, og ut fra det, vil det skape en Beskjed skal leveres av MessageService.

Bekreftelsen vår vil være enkel, bekreft at vi ringte MessageService nøyaktig 1 gang med hvilken som helst melding:

verifisere (messageService, times (1)). deliverMessage (any (Message.class));

Fordi de Beskjed er konstruert inne i metoden som testes, vi er tvunget til å bruke noen som matcher.

Denne tilnærmingen lar oss ikke validere dataene i Beskjed, som kan være forskjellige sammenlignet med dataene inne MessageDTO.

Av den grunn skal vi implementere en tilpasset argumentmatcher:

offentlig klasse MessageMatcher implementerer ArgumentMatcher {privat melding igjen; // constructors @Override public boolean matches (Message right) {return left.getFrom (). equals (right.getFrom ()) && left.getTo (). equals (right.getTo ()) && left.getText (). er lik (right.getText ()) && right.getDate ()! = null && right.getId ()! = null; }}

For å bruke matcheren vår, må vi endre testen og erstatte den noen av argThat:

verifisere (messageService, times (1)). deliverMessage (argThat (ny MessageMatcher (melding)));

Nå vet vi vår Beskjed forekomst vil ha de samme dataene som vår MessageDTO.

5. Custom Argument Matcher vs. ArgumentCaptor

Begge teknikkene tilpassede argumentmatchere og ArgumentCaptor kan brukes til å sikre at visse argumenter ble overført til mocks.

Derimot,ArgumentCaptor kan passe bedre hvis vi trenger det for å hevde argumentverdier for å fullføre bekreftelsen eller vår tilpasset argumentmatcher vil sannsynligvis ikke bli gjenbrukt.

Egendefinerte argumentmatchere via ArgumentMatcher er vanligvis bedre for stubbing.

6. Konklusjon

I denne artikkelen har vi utforsket en funksjon av Mockito, ArgumentMatcher og dens forskjell med ArgumentCaptor.

Som alltid er hele kildekoden til eksemplene tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found