Mockito.mock () versus @Mock versus @MockBean

1. Overzicht

In deze korte tutorial bekijken we drie verschillende manieren om nepobjecten te maken en hoe ze van elkaar verschillen - met Mockito en met de Spring-mocking-ondersteuning.

2. Mockito. Bespotten ()

De Mockito. Bespotten () methode stelt ons in staat om een ​​nepobject van een klasse of een interface te maken.

Vervolgens kunnen we de mock gebruiken om retourwaarden voor de methoden te stubben en controleren of ze zijn aangeroepen.

Laten we naar een voorbeeld kijken:

@Test openbare leegte gegevenCountMethodMocked_WhenCountInvoked_ThenMockedValueReturned () {UserRepository localMockRepository = Mockito.mock (UserRepository.class); Mockito.when (localMockRepository.count ()). ThenReturn (111L); lang userCount = localMockRepository.count (); Assert.assertEquals (111L, userCount); Mockito.verify (localMockRepository) .count (); }

Voor deze methode hoeft verder niets te worden gedaan voordat deze kan worden gebruikt. We kunnen het gebruiken om zowel nepklasse-velden als lokale nep-velden in een methode te maken.

3. Mockito's @Bespotten Annotatie

Deze annotatie is een afkorting voor de Mockito. Bespotten () methode. We zouden het ook alleen in een testles moeten gebruiken. In tegenstelling tot de bespotten() methode, moeten we Mockito-annotaties inschakelen om deze annotatie te gebruiken.

We kunnen dit doen door de MockitoJUnitRunner om de test uit te voeren of het MockitoAnnotations.initMocks () methode expliciet.

Laten we een voorbeeld bekijken met MockitoJUnitRunner:

@RunWith (MockitoJUnitRunner.class) openbare klasse MockAnnotationUnitTest {@Mock UserRepository mockRepository; @Test openbare leegte gegevenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned () {Mockito.when (mockRepository.count ()). ThenReturn (123L); lang userCount = mockRepository.count (); Assert.assertEquals (123L, userCount); Mockito.verify (mockRepository) .count (); }}

Afgezien van het beter leesbaar maken van de code, @Bespotten maakt het gemakkelijker om het nepprobleem te vinden in het geval van een fout, aangezien de naam van het veld in het foutbericht verschijnt:

Gezocht maar niet aangeroepen: mockRepository.count (); -> bij org.baeldung.MockAnnotationTest.testMockAnnotation (MockAnnotationTest.java:22) Eigenlijk waren er geen interacties met deze mock. bij org.baeldung.MockAnnotationTest.testMockAnnotation (MockAnnotationTest.java:22) 

Ook bij gebruik in combinatie met @InjectMocks, kan het de hoeveelheid setup-code aanzienlijk verminderen.

4. Spring Boot's @RTLnieuws Annotatie

We kunnen de @RTLnieuws om nepobjecten toe te voegen aan de Spring-toepassingscontext. De mock vervangt elke bestaande bean van hetzelfde type in de toepassingscontext.

Als er geen boon van hetzelfde type is gedefinieerd, wordt er een nieuwe toegevoegd. Deze annotatie is handig bij integratietests waarbij een bepaalde boon - bijvoorbeeld een externe service - moet worden bespot.

Om deze annotatie te gebruiken, moeten we SpringRunner om de test uit te voeren:

@RunWith (SpringRunner.class) openbare klasse MockBeanAnnotationIntegrationTest {@MockBean UserRepository mockRepository; @Autowired ApplicationContext-context; @Test openbare leegte gegevenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned () {Mockito.when (mockRepository.count ()). ThenReturn (123L); UserRepository userRepoFromContext = context.getBean (UserRepository.class); lang userCount = userRepoFromContext.count (); Assert.assertEquals (123L, userCount); Mockito.verify (mockRepository) .count (); }}

Wanneer we de annotatie op een veld gebruiken, en niet alleen worden geregistreerd in de toepassingscontext, wordt de mock ook in het veld geïnjecteerd.

Dit blijkt uit de bovenstaande code. Hier hebben we de geïnjecteerde gebruikt UserRepository bespotten om de tellen methode. We hebben vervolgens de boon uit de toepassingscontext gebruikt om te verifiëren dat het inderdaad de bespotte boon is.

5. Conclusie

In dit artikel hebben we gezien hoe de drie methoden voor het maken van nepobjecten verschillen en hoe ze allemaal kunnen worden gebruikt.

De broncode die bij dit artikel hoort, is beschikbaar op GitHub.


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