De mock-methoden van Mockito

1. Overzicht

Deze tutorial illustreert verschillende toepassingen van de standaard static bespotten methoden van de Mockito API.

Net als bij andere artikelen die zijn gericht op het Mockito-framework (zoals Mockito Verify of Mockito When / Then), is de Mijn lijst de hieronder getoonde klasse zal worden gebruikt als de medewerker die in testgevallen wordt bespot:

openbare klasse MyList breidt AbstractList uit {@Override public String get (int index) {return null; } @Override public int size () {return 1; }}

2. Eenvoudig bespotten

De eenvoudigste overbelaste variant van de bespotten methode is degene met een enkele parameter voor de klasse die moet worden bespot:

openbare statische T-mock (Class classToMock)

We zullen deze methode gebruiken om een ​​klas te bespotten en een verwachting in te stellen:

MyList listMock = mock (MyList.class); when (listMock.add (anyString ())). thenReturn (false);

Voer vervolgens een methode uit op de mock:

boolean toegevoegd = listMock.add (randomAlphabetic (6));

De volgende code bevestigt dat het toevoegen methode is aangeroepen op de mock, en dat de aanroep een waarde retourneert die overeenkomt met de verwachting die we eerder hebben ingesteld:

verifieer (listMock) .add (anyString ()); assertThat (toegevoegd, is (false));

3. Bespotten met Mock's Name

In deze sectie behandelen we een andere variant van de bespotten methode die is voorzien van een argument dat de naam van de mock specificeert:

openbare statische T-mock (Class classToMock, String-naam)

Over het algemeen heeft de naam van een mock niets te maken met werkende code, maar kan deze nuttig zijn als het gaat om foutopsporing, waarbij de naam van de mock wordt gebruikt om verificatiefouten op te sporen.

Om er zeker van te zijn dat de opgegeven naam van een mock is opgenomen in het bericht van een uitzondering die is gegenereerd door een mislukte verificatie, vertrouwen we op een JUnit-implementatie van de TestRule interface, genaamd ExpectedException, en neem het op in een testles:

@Rule openbaar ExpectedException gegooid = ExpectedException.none ();

Deze regel wordt gebruikt om uitzonderingen af ​​te handelen die door testmethoden worden gegenereerd.

In de volgende code maken we een mock-up voor de Mijn lijst klasse en noem maar op myMock:

MyList listMock = mock (MyList.class, "myMock");

Stel daarna een verwachting in voor een methode van de mock en voer deze uit:

when (listMock.add (anyString ())). thenReturn (false); listMock.add (randomAlphabetic (6));

We zullen een opzettelijk mislukte verificatie maken die een uitzondering zou moeten genereren met het bericht met informatie over de mock. Om dit te kunnen doen, moeten eerst de verwachtingen over de uitzondering worden bepaald:

gegooid.expect (TooLittleActualInvocations.class); gegooid.expectMessage (bevatString ("myMock.add"));

De volgende verificatie zou moeten mislukken en een uitzondering moeten genereren die overeenkomt met wat werd verwacht:

verifieer (listMock, times (2)). add (anyString ());

Hier is het bericht van de gegenereerde uitzondering:

org.mockito.exceptions.verification.TooLittleActualInvocations: myMock.add (); 2 keer gezocht: op com.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect (MockitoMockTest.java: ...) maar was 1 keer: op com.baeldung.mockito.MockitoMockTest .whenUsingMockWithName_thenCorrect (MockitoMockTest ...

Zoals we kunnen zien, is de naam van de mock opgenomen in het uitzonderingsbericht, wat handig zal zijn om het foutpunt te vinden in het geval van een mislukte verificatie.

4. Bespotten met Antwoord

Hier zullen we het gebruik van een bespotten variant waarin de strategie voor de antwoorden van de mock op interactie wordt geconfigureerd tijdens het maken. Dit bespotten de handtekening van de methode in de Mockito-documentatie ziet er als volgt uit:

openbare statische T-mock (Class classToMock, Answer defaultAnswer)

Laten we beginnen met de definitie van een implementatie van het Antwoord koppel:

klasse CustomAnswer implementeert Answer {@Override openbaar Booleaans antwoord (InvocationOnMock-aanroep) gooit Throwable {return false; }}

De CustomAnswer klasse hierboven wordt gebruikt voor het genereren van een mock:

MyList listMock = mock (MyList.class, nieuwe CustomAnswer ());

Als we geen verwachting voor een methode stellen, is het standaardantwoord, dat is geconfigureerd door de CustomAnswer type, zal een rol gaan spelen. Om het te bewijzen, slaan we de stap voor het instellen van de verwachting over en gaan we naar de uitvoering van de methode:

boolean toegevoegd = listMock.add (randomAlphabetic (6));

De volgende verificatie en bewering bevestigen dat het bespotten methode met een Antwoord argument heeft gewerkt zoals verwacht:

verifieer (listMock) .add (anyString ()); assertThat (toegevoegd, is (false));

5. Bespotten met MockSettings

De laatste bespotten methode die in dit artikel wordt behandeld, is de variant met een parameter van de MockSettings type. Deze overbelaste methode wordt gebruikt om een ​​niet-standaard mock te maken.

Er zijn verschillende aangepaste instellingen die worden ondersteund door methoden van de MockSettings interface, zoals het registreren van een luisteraar voor methode-aanroepen op de huidige mock with invocationListeners, serialisatie configureren met serialiseerbaar, waarbij de instantie wordt opgegeven waarmee wordt bespioneerd spiedInstance, waarbij Mockito wordt geconfigureerd om te proberen een constructor te gebruiken bij het instantiëren van een mock with useConstructor, en enkele anderen.

Voor het gemak zullen we het CustomAnswer klasse geïntroduceerd in de vorige sectie om een MockSettings implementatie die een standaardantwoord definieert.

EEN MockSettings object wordt als volgt geïnstantieerd door een fabrieksmethode:

MockSettings customSettings = withSettings (). DefaultAnswer (nieuwe CustomAnswer ());

Dat instellingsobject zal worden gebruikt bij het maken van een nieuwe mock:

MyList listMock = mock (MyList.class, customSettings);

Net als in de voorgaande sectie, zullen we de toevoegen methode van een Mijn lijst instantie en controleer of a bespotten methode met een MockSettings argument werkt zoals het bedoeld is door het volgende codefragment te gebruiken:

boolean toegevoegd = listMock.add (randomAlphabetic (6)); verifieer (listMock) .add (anyString ()); assertThat (toegevoegd, is (false));

6. Conclusie

Deze tutorial behandelt de bespotten methode van Mockito in detail. De implementatie van deze voorbeelden en codefragmenten is te vinden in een GitHub-project.