Mockito geavanceerd: argumentcaptors en spies
Vang methodeargumenten op met ArgumentCaptor en mock echte objecten gedeeltelijk met Mockito.spy.
Mockito geavanceerd: argumentcaptors en spies is een gratis Java Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
ArgumentCaptor: Methodeargumenten vastleggen
ArgumentCaptor legt de argumenten vast die aan een nagebootste methode worden doorgegeven, zodat je ze kunt controleren. Dit is handig wanneer het argument binnen het systeem onder test wordt opgebouwd en je er niet rechtstreeks bij kunt.
ArgumentCaptor maken en gebruiken
Maak een captor voor het type van het argument, geef captor.capture() door als argumentmatcher in verify() en roep daarna captor.getValue() aan om het vastgelegde argument op te halen.
@Test
void sends_correct_email() {
ArgumentCaptor<EmailMessage> captor = ArgumentCaptor.forClass(EmailMessage.class);
userService.register(new CreateUserRequest("alice@example.com"));
verify(emailService).send(captor.capture());
EmailMessage msg = captor.getValue();
assertEquals("alice@example.com", msg.getTo());
assertTrue(msg.getSubject().contains("Welcome"));
}@Captor-annotatie
Gebruik @Captor met @ExtendWith(MockitoExtension.class) om omslachtige aanroepen van ArgumentCaptor.forClass() te vermijden.
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock EmailService emailService;
@Captor ArgumentCaptor<EmailMessage> emailCaptor;
@Test
void captures_email() {
// ...
verify(emailService).send(emailCaptor.capture());
assertEquals("Welcome!", emailCaptor.getValue().getSubject());
}
}Meerdere aanroepen vastleggen
Gebruik captor.getAllValues() wanneer de methode meerdere keren wordt aangeroepen. Dit retourneert een lijst met alle vastgelegde waarden in de volgorde van aanroepen.
verify(emailService, times(3)).send(emailCaptor.capture());
List<EmailMessage> messages = emailCaptor.getAllValues();
assertEquals(3, messages.size());
assertEquals("Confirmation", messages.get(0).getSubject());Mockito-spy-objecten: gedeeltelijk nabootsen
Mockito.spy() omhult een echt object. Alle methoden gedragen zich normaal tenzij je er expliciet een stub voor instelt. Gebruik dit wanneer je een class met enkele moeilijk te testen afhankelijkheden wilt testen, maar de meeste functionaliteit gewoon werkt.
List<String> realList = new ArrayList<>();
List<String> spy = Mockito.spy(realList);
spy.add("hello"); // calls real ArrayList.add()
System.out.println(spy.size()); // 1 — real method called
doReturn(42).when(spy).size(); // stub just size()
System.out.println(spy.size()); // 42 — stubbed@Spy-annotatie
Gebruik @Spy met @ExtendWith(MockitoExtension.class) om spy-objecten te maken. Het veld moet geïnitialiseerd zijn, rechtstreeks of via @Spy UserService svc = new UserService(repo);.
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Spy
OrderService orderService = new OrderService(mockRepo, mockEmail);
}Spring-beans nabootsen met @SpyBean
In Spring Boot-tests omhult @SpyBean een bestaande Spring-bean met een Mockito-spy — het werkelijke gedrag blijft behouden tenzij je een stub instelt. Dit combineert goed met @SpringBootTest.
@SpringBootTest
class IntegrationTest {
@SpyBean EmailService emailService;
@Test
void order_sends_email() {
orderService.placeOrder(cart);
verify(emailService).sendConfirmation(any());
}
}doReturn versus when().thenReturn() voor spy-objecten
Gebruik voor spy-objecten doReturn(value).when(spy).method() in plaats van when(spy.method()).thenReturn(value). De vorm when(spy.method()) roept de echte methode daadwerkelijk aan, wat bijwerkingen kan veroorzaken.
// Correct for spies:
doReturn(List.of()).when(spy).findAll();
// WRONG for spies — calls real findAll() first:
when(spy.findAll()).thenReturn(List.of()); // real method called!Geen interacties verifiëren
Gebruik verifyNoInteractions(mock) om te controleren dat een mock nooit is aangeroepen, en verifyNoMoreInteractions(mock) na alle verwachte aanroepen om onverwachte aanroepen te vinden.
verifyNoInteractions(emailService); // never called
verify(repo).save(any());
verifyNoMoreInteractions(repo); // save() was the only interactionAanroevolgorde met InOrder verifiëren
Gebruik InOrder om te controleren dat nagebootste methoden in een specifieke volgorde zijn aangeroepen.
InOrder inOrder = inOrder(repo, emailService);
inOrder.verify(repo).save(any());
inOrder.verify(emailService).send(any()); // save happened BEFORE sendArgumentmatchers
Combineer captors met matchers: any(), eq(), anyString(), argThat(predicate). Als één argument een matcher gebruikt, moeten alle argumenten matchers gebruiken.
verify(repo).save(argThat(user ->
user.getEmail().endsWith("@example.com") &&
user.getStatus() == UserStatus.ACTIVE));Korte controle
Waarom gebruik je doReturn in plaats van when().thenReturn() bij het instellen van een spy?
Samenvatting
ArgumentCaptor legt argumenten vast zodat je ze na de aanroep kunt controleren. Spy-objecten omhullen echte objecten en delegeren de uitvoering tenzij je een stub instelt. Gebruik doReturn voor spy-objecten en @SpyBean voor Spring-integratietests. Verifieer de aanroevolgorde met InOrder.
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “Mockito geavanceerd: argumentcaptors en spies” gratis?
Ja — de volledige tekst van “Mockito geavanceerd: argumentcaptors en spies” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “Mockito geavanceerd: argumentcaptors en spies”?
Vang methodeargumenten op met ArgumentCaptor en mock echte objecten gedeeltelijk met Mockito.spy. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Mockito geavanceerd: argumentcaptors en spies”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Geparametriseerde tests met @CsvSource en @MethodSource
- Mockito geavanceerd: argumentcaptors en spies
- Spring Boot-testslices: @WebMvcTest en @DataJpaTest
- Testcontainers: integratietests met een echte database