Mocking Void Methods met Mockito

1. Overzicht

In deze korte tutorial concentreren we ons op spot leegte methoden met Mockito.

Net als bij andere artikelen die zijn gericht op het Mockito-framework (zoals Mockito Verify, Mockito When / Then en Mockito's Mock Methods), Mijn lijst hieronder getoonde klasse zal worden gebruikt als medewerker in testgevallen.

We voegen een nieuwe methode toe aan deze tutorial:

public class MyList breidt AbstractList uit {@Override public void add (int index, String element) {// no-op}}

2. Eenvoudig bespotten en verifiëren

Ongeldig methoden kunnen worden gebruikt met Mockito's niets doen(), doThrow (), en doAnswer () methoden, spottend maken en intuïtief verifiëren:

@Test openbare leegte whenAddCalledVerified () {MyList myList = mock (MyList.class); doNothing (). when (myList) .add (isA (Integer.class), isA (String.class)); myList.add (0, ""); verifieer (myList, times (1)). add (0, ""); }

Echter, niets doen() is het standaardgedrag van Mockito voor leegte methoden.

Deze versie van whenAddCalledVerified () bereikt hetzelfde als hierboven:

@Test openbare leegte whenAddCalledVerified () {MyList myList = mock (MyList.class); myList (0, ""); verifieer (myList, times (1)). add (0, ""); } 

DoThrow () genereert een uitzondering:

@Test (verwacht = Exception.class) public void givenNull_AddThrows () {MyList myList = mock (MyList.class); doThrow (). when (myList) .add (isA (Integer.class), isNull ()); myList.add (0, null); } 

We dekken doAnswer () hieronder.

3. Argument vastleggen

Een reden om het standaardgedrag te overschrijven met niets doen() is om argumenten vast te leggen.

In het bovenstaande voorbeeld hebben we de verifiëren() methode om de doorgegeven argumenten te controleren toevoegen().

Het is echter mogelijk dat we de argumenten moeten vangen en er iets meer mee moeten doen.

In deze gevallen gebruiken we niets doen() net als hierboven, maar met een ArgumentCaptor:

@Test openbare leegte whenAddCalledValueCaptured () {MyList myList = mock (MyList.class); ArgumentCaptor valueCapture = ArgumentCaptor.forClass (String.class); doNothing (). when (myList) .add (any (Integer.class), valueCapture.capture ()); myList.add (0, "gevangen"); assertEquals ("gevangen", valueCapture.getValue ()); } 

4. Beantwoorden van een oproep aan Ongeldig

Een methode kan complexer gedrag vertonen dan alleen het toevoegen of instellen van waarde.

Voor deze situaties kunnen we Mockito's gebruiken Antwoord om het gedrag toe te voegen dat we nodig hebben:

@Test openbare leegte whenAddCalledAnswered () {MyList myList = mock (MyList.class); doAnswer (invocation -> {Object arg0 = invocation.getArgument (0); Object arg1 = invocation.getArgument (1); assertEquals (3, arg0); assertEquals ("answer me", arg1); return null;}). when (myList) .add (any (Integer.class), any (String.class)); myList.add (3, "antwoord mij"); } 

Zoals uitgelegd in de Java 8-functies van Mockito, gebruiken we een lambda met Antwoord om aangepast gedrag te definiëren voor toevoegen().

5. Gedeeltelijk bespotten

Gedeeltelijke spot is ook een optie. Mockito's doCallRealMethod () kan worden gebruikt voor leegte methoden:

@Test openbare leegte whenAddCalledRealMethodCalled () {MyList myList = mock (MyList.class); doCallRealMethod (). when (myList) .add (any (Integer.class), any (String.class)); myList.add (1, "echt"); verifieer (myList, times (1)). add (1, "real"); } 

Op deze manier kunnen we de daadwerkelijke methode oproepen en deze tegelijkertijd verifiëren.

6. Conclusie

In dit korte artikel hebben we vier verschillende manieren van benaderen behandeld leegte methoden bij het testen met Mockito.

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