Mockito ArgumentMatchers

1. Overzicht

Deze tutorial laat zien hoe u de ArgumentMatcher en hoe het verschilt van de ArgumentCaptor.

Raadpleeg dit artikel voor een inleiding tot het Mockito-framework.

2. Maven afhankelijkheden

We moeten een enkel artefact toevoegen:

 org.mockito mockito-core 2.21.0 test 

De nieuwste versie van Mockito is te vinden op Maven Central.

3. ArgumentMatchers

Het is mogelijk om een ​​bespotte methode op verschillende manieren te configureren. Een daarvan is om vaste waarden te retourneren:

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

In het bovenstaande voorbeeld is de Draad "Bloem" wordt alleen geretourneerd als de analyse-service het Draad "papaver".

Maar misschien moeten we reageren op een breder scala aan waarden of vooraf onbekende waarden.

In al deze scenario's we kunnen onze bespotte methoden configureren met argumentmatchers:

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

Nu, vanwege de anyString argument matcher, zal het resultaat hetzelfde zijn, ongeacht de waarde die we doorgeven om te analyseren. ArgumentMatchers staat ons flexibele verificatie of stubbing toe.

In het geval dat een methode meer dan één argument heeft, het is niet mogelijk om te gebruiken ArgumentMatchers voor slechts enkele van de argumenten. Mockito vereist dat u alle argumenten opgeeft door matchers of door exacte waarden.

Een volgend voorbeeld is een onjuiste benadering hiervan:

abstracte klasse FlowerService {openbare abstracte boolean isABigFlower (String naam, int bloemblaadjes); } FlowerService mock = mock (FlowerService.class); when (mock.isABigFlower ("poppy", anyInt ())). thenReturn (true);

Om het te repareren en het Draad noem "poppy" zoals het is gewenst, zullen we gebruiken eq matcher:

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

Er zijn nog twee punten waar u op moet letten wanneer matchers worden gebruikt:

  • We kunnen ze niet als retourwaarde gebruiken, is een exacte waarde vereist bij het stubben van oproepen
  • Tenslotte, we kunnen geen argument gebruiken matchers buiten verificatie of stoten

In het laatste geval Mockito zal het misplaatste argument detecteren en een InvalidUseOfMatchersException.

Een slecht voorbeeld zou kunnen zijn:

String orMatcher = or (eq ("poppy"), endsWith ("y")); verifieer (mock) .analyze (orMatcher);

De manier om de bovenstaande code te implementeren is:

verifieer (mock) .analyze (of (eq ("poppy"), endsWith ("y")));

Mockito biedt ook Additionele Matchers om algemene logische bewerkingen (‘niet’, ‘en’, ‘of’) op te implementeren ArgumentMatchers die overeenkomen met zowel primitieve als niet-primitieve typen:

verifieer (mock) .analyze (of (eq ("poppy"), endsWith ("y")));

4. Matcher voor aangepaste argumenten

Creëren onze matcher kan goed zijn om de best mogelijke aanpak voor een bepaald scenario te selecteren en de hoogste kwaliteit te testen, die schoon en onderhoudbaar is.

We zouden bijvoorbeeld een MessageController dat berichten bezorgt. Het zal een BerichtDTO, en van daaruit zal het een Bericht worden geleverd door MessageService.

Onze verificatie is eenvoudig, controleer of we het MessageService precies 1 keer met elk bericht:

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

Omdat de Bericht is geconstrueerd binnen de te testen methode, we zijn gedwongen te gebruiken ieder als de matcher.

Met deze aanpak kunnen we de gegevens in het Bericht, die kunnen verschillen in vergelijking met de gegevens erin BerichtDTO.

Om die reden gaan we een aangepaste argument-matcher implementeren:

public class MessageMatcher implementeert ArgumentMatcher {private Message left; // constructors @ Openbare booleaanse overeenkomsten overschrijven (Bericht rechts) {retourneer left.getFrom (). equals (right.getFrom ()) && left.getTo (). equals (right.getTo ()) && left.getText (). is gelijk aan (right.getText ()) && right.getDate ()! = null && right.getId ()! = null; }}

Om onze matcher te gebruiken, moeten we onze test aanpassen en vervangen ieder door argThat:

verifieer (messageService, times (1)). deliverMessage (argThat (new MessageMatcher (message)));

Nu kennen we onze Bericht instantie zal dezelfde gegevens hebben als onze BerichtDTO.

5. Aangepast argument Matcher vs. ArgumentCaptor

Beide technieken aangepaste argument-matchers en ArgumentCaptor kan worden gebruikt om ervoor te zorgen dat bepaalde argumenten werden doorgegeven aan spot.

Echter,ArgumentCaptor past misschien beter als we het nodig hebben om te beweren op argumentwaarden om de verificatie te voltooien of onze aangepaste argument matcher zal waarschijnlijk niet worden hergebruikt.

Matchers voor aangepaste argumenten via ArgumentMatcher zijn meestal beter voor stoten.

6. Conclusie

In dit artikel hebben we een kenmerk van Mockito, ArgumentMatcher en het verschil met ArgumentCaptor.

Zoals altijd is de volledige broncode van de voorbeelden beschikbaar op GitHub.


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