Java Academy · Les

Mockito geavanceerd: argumentcaptors en spies

Vang methodeargumenten op met ArgumentCaptor en mock echte objecten gedeeltelijk met Mockito.spy.

Les 2 van 413 stappen

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 interaction

Aanroevolgorde 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 send

Argumentmatchers

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.

Gratis beginnen

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

  1. Geparametriseerde tests met @CsvSource en @MethodSource
  2. Mockito geavanceerd: argumentcaptors en spies
  3. Spring Boot-testslices: @WebMvcTest en @DataJpaTest
  4. Testcontainers: integratietests met een echte database
← Terug naar Java Academy