Mockito ArgumentMatchers

1. Pregled

Ovaj tutorial pokazuje kako koristiti ArgumentMatcher i kako se razlikuje od ArgumentCaptor.

Uvod u Mockito okvir pogledajte u ovom članku.

2. Ovisnosti Mavena

Moramo dodati jedan artefakt:

 org.mockito mockito-core 2.21.0 test 

Najnovija verzija Mockito može se naći na Maven Central.

3. ArgumentMatchers

Moguća je konfiguracija ismijane metode na razne načine. Jedan od njih je vraćanje fiksnih vrijednosti:

doReturn ("Flower"). when (flowerService) .analyze ("mak");

U gornjem primjeru, Niz "Cvijet" se vraća samo kada služba za analizu primi Niz "mak".

Ali možda trebamo odgovoriti na širi raspon vrijednosti ili unaprijed nepoznate vrijednosti.

U svim tim scenarijima, možemo konfigurirati naše ismijane metode s argumentpodudaranja:

kada (flowerService.analyze (anyString ())). thenReturn ("Flower");

Sada, zbog anyString podudaranje argumenata, rezultat će biti isti bez obzira koju vrijednost proslijedimo analizirati. ArgumentMatchers omogućuje nam fleksibilnu provjeru ili prevrtanje.

U slučaju da metoda ima više argumenata, nije moguće koristiti ArgumentMatchers samo za neke argumente. Mockito zahtijeva da navedete sve argumente bilo podudaranja ili točnim vrijednostima.

Sljedeći je primjer netočan pristup ovome:

apstraktna klasa FlowerService {public abstract boolean isABigFlower (Naziv niza, int latice); } FlowerService mock = lažni (FlowerService.class); kada (mock.isABigFlower ("mak", bilo kojiInt ())). thenReturn (true);

Da biste to popravili i zadržali Niz naziv "mak" po želji, mi ćemo koristiti eq podudaranje:

when (mock.isABigFlower (eq ("mak"), anyInt ())). thenReturn (true);

Postoje još dvije točke o kojima treba voditi računa podudaranja su korišteni:

  • Ne možemo ih koristiti kao povratnu vrijednost, točna vrijednost potrebna je kod zaglupljivanja poziva
  • Konačno, ne možemo koristiti argument podudaranja izvan provjere ili zapinjanja

U posljednjem slučaju, Mockito će otkriti pogrešno postavljeni argument i baciti znak InvalidUseOfMatchersException.

Loš primjer bi mogao biti:

String orMatcher = ili (eq ("mak"), endsWith ("y")); verify (mock) .analyze (orMatcher);

Način implementacije gornjeg koda je:

verify (mock) .analyze (or (eq ("mak"), endsWith ("y")));

Mockito također pruža AdditionalMatchers za provedbu uobičajenih logičkih operacija ("ne", "i", "ili") na ArgumentMatchers koji se podudaraju s primitivnim i neprimitivnim vrstama:

verify (mock) .analyze (or (eq ("mak"), endsWith ("y")));

4. Podudaranje prilagođenih argumenata

Stvaranje naše podudaranje može biti dobro odabrati najbolji mogući pristup za zadani scenarij i proizvesti test najviše kvalitete, koji je čist i održiv.

Na primjer, mogli bismo dobiti MessageController koja isporučuje poruke. Primit će MessageDTO, i od toga će stvoriti Poruka dostaviti do MessageService.

Naša provjera bit će jednostavna, provjerite jeste li nazvali MessageService točno 1 put sa bilo koja poruka:

verify (messageService, puta (1)). DeliveryMessage (bilo koji (Message.class));

Jer the Poruka je konstruiran unutar metode koja se ispituje, prisiljeni smo koristiti bilo koji kao podudaranje.

Ovaj nam pristup ne dopušta provjeru valjanosti podataka unutar Poruka, koji mogu biti različiti u usporedbi s podacima unutar MessageDTO.

Iz tog razloga implementirat ćemo prilagođeno podudaranje argumenata:

javna klasa MessageMatcher implementira ArgumentMatcher {privatna poruka lijevo; // konstruktori @Preuzmi javna logička podudaranja (Poruka desno) {return left.getFrom (). equals (right.getFrom ()) && left.getTo (). equals (right.getTo ()) && left.getText (). jednako (right.getText ()) && right.getDate ()! = null && right.getId ()! = null; }}

Da bismo koristili naše podudaranje, moramo izmijeniti test i zamijeniti ga bilo koji po argThat:

verify (messageService, times (1)). DeliveryMessage (argThat (novi MessageMatcher (poruka)));

Sada znamo svoje Poruka instanca imat će iste podatke kao i naša MessageDTO.

5. Podudaranje prilagođenih argumenata vs. ArgumentCaptor

Obje tehnike prilagođavanje argumenata i ArgumentCaptor može se koristiti za osiguravanje da su određeni argumenti proslijeđeni lažnim porukama.

Međutim,ArgumentCaptor može bolje odgovarati ako nam treba za potvrđivanje vrijednosti argumenata dovršiti provjeru ili naš prilagođavanje argumenata nije vjerojatno da će se ponovno upotrijebiti.

Prilagođeni argumenti preko ArgumentMatcher su obično bolji za trljanje.

6. Zaključak

U ovom smo članku istražili značajku Mockito, ArgumentMatcher i njegova razlika sa ArgumentCaptor.

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.


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