Terugbelopdrachten testen met Mockito

1. Overzicht

In deze korte tutorial zullen we ons concentreren op hoe u terugbelverzoeken kunt testen met behulp van het populaire testraamwerk Mockito.

We onderzoeken twee oplossingen, eerst met behulp van een ArgumentCaptor en dan het intuïtieve doAnswer () methode.

Bekijk hier onze Mockito-serie voor meer informatie over goed testen met Mockito.

2. Inleiding tot terugbellen

Een callback is een stukje code dat als argument wordt doorgegeven aan een methode, waarvan wordt verwacht dat het het argument op een bepaald moment terugroept (uitvoert).

Deze uitvoering kan onmiddellijk plaatsvinden, zoals bij een synchrone callback, maar kan meestal op een later tijdstip plaatsvinden, zoals bij een asynchrone callback.

Een veelvoorkomend scenario voor het gebruik van terugbelopdrachten is tijdens service-interacties wanneer we de reactie van een serviceaanvraag moeten verwerken.

In deze tutorial gebruiken we de Onderhoud interface hieronder weergegeven als de medewerker in testcases:

openbare interface Service {void doAction (String-verzoek, terugbellen); }

In de Bel terug argument geven we een klasse door die het antwoord afhandelt met behulp van de antwoord (T-antwoord) methode:

openbare interface Terugbellen {ongeldig antwoord (T-antwoord); } 

2.1. Een eenvoudige service

We gebruiken ook een eenvoudig servicevoorbeeld om te demonstreren hoe u de callback kunt doorgeven en aanroepen:

public void doAction () {service.doAction ("our-request", new Callback () {@Override public void reply (Response response) {handleResponse (response);}}); } 

De handleResponse methode controleert of het antwoord geldig is voordat gegevens aan het Reactie voorwerp:

private void handleResponse (antwoordantwoord) {if (response.isValid ()) {response.setData (nieuwe gegevens ("Succesvol gegevensantwoord")); }}

Voor de duidelijkheid hebben we ervoor gekozen om geen Java Lamda-expressie te gebruiken, maar de service.doActioncall kan ook beknopter worden geschreven:

service.doAction ("ons-verzoek", antwoord -> handleResponse (antwoord)); 

Kijk hier voor meer informatie over Lambda-uitdrukkingen.

3. Met behulp van een ArgumentCaptor

Laten we nu eens kijken hoe we Mockito gebruiken om het Bel terug object met behulp van een ArgumentCaptor:

@Test openbare ongeldig gegevenServiceWithValidResponse_whenCallbackReceived_thenProcessed () {ActionHandler handler = nieuwe ActionHandler (service); handler.doAction (); verifieer (service) .doAction (anyString (), callbackCaptor.capture ()); Callback callback = callbackCaptor.getValue (); Reactie reactie = nieuwe reactie (); callback.reply (antwoord); String verwachteMessage = "Succesvolle gegevensreactie"; Gegevensgegevens = response.getData (); assertEquals ("Moet een succesvol bericht ontvangen:", verwachtMessage, data.getMessage ()); }

In dit voorbeeld maken we eerst een ActionHandler voordat u het doAction methode van deze handler. Dit is gewoon een verpakking voor onze Simple Service doAction methode oproep dat is waar we onze callback aanroepen.

Vervolgens verifiëren we dat doAction werd opgeroepen toen onze nep-service-instantie voorbijging anyString () als het eerste argument en callbackCaptor.capture () als de tweede, waar we de Bel terug voorwerp. De getValue () methode kan vervolgens worden gebruikt om de vastgelegde waarde van het argument te retourneren.

Nu we de Bel terug object maken we een Reactie object dat standaard geldig is voordat we bel de antwoord methode rechtstreeks en beweer dat de antwoordgegevens de juiste waarde hebben.

4. Gebruik de doAnswer () Methode

Nu gaan we kijken naar een algemene oplossing voor stubbing-methoden die callbacks hebben met behulp van Mockito's Antwoord object en doAnswer methode om de ongeldige methode te stoppendoAction:

@Test openbare ongeldige gegevenServiceWithInvalidResponse_whenCallbackReceived_thenNotProcessed () {Reactie reactie = nieuwe reactie (); response.setIsValid (false); doAnswer ((Answer) invocation -> {Callback callback = invocation.getArgument (1); callback.reply (response); Data data = response.getData (); assertNull ("Geen data in ongeldig antwoord:", data); return null;}). when (service) .doAction (anyString (), any (Callback.class)); ActionHandler-handler = nieuwe ActionHandler (service); handler.doAction (); } 

En in ons tweede voorbeeld creëren we eerst een invalid Reactie object dat later in de test zal worden gebruikt.

Vervolgens stellen we het Antwoord op onze mock-service, zodat wanneer doAction wordt genoemd, we onderscheppen de aanroep en pakken de methode-argumenten met invocation.getArgument (1) om het Bel terug argument.

De laatste stap is het maken van het ActionHandler en bel doAction waardoor de Antwoord worden ingeroepen.

Kijk hier voor meer informatie over methoden voor het tegenhouden van leegte.

3. Conclusie

In dit korte artikel hebben we twee verschillende manieren besproken om testcallbacks te benaderen bij het testen met Mockito.

Zoals altijd zijn de voorbeelden beschikbaar in dit GitHub-project.