Java Academy · Lektion

Mockito für Fortgeschrittene: Argument-Captoren und Spies

Fangen Sie Methodenargumente mit ArgumentCaptor ab und simulieren Sie echte Objekte mit Mockito.spy teilweise.

Lektion 2 von 413 Schritte

Mockito für Fortgeschrittene: Argument-Captoren und Spies ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

ArgumentCaptor: Methodenargumente erfassen

ArgumentCaptor erfasst die an eine gemockte Methode übergebenen Argumente, sodass Sie sie überprüfen können. Das ist nützlich, wenn das Argument innerhalb des zu testenden Systems erstellt wird und Sie nicht direkt darauf zugreifen können.

ArgumentCaptor erstellen und verwenden

Erstellen Sie einen Captor für den Argumenttyp, übergeben Sie captor.capture() als Argument-Matcher in verify() und rufen Sie anschließend captor.getValue() auf, um das erfasste Argument abzurufen.

@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-Annotation

Verwenden Sie @Captor zusammen mit @ExtendWith(MockitoExtension.class), um ausführliche Aufrufe von ArgumentCaptor.forClass() zu vermeiden.

@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());
    }
}

Mehrere Aufrufe erfassen

Verwenden Sie captor.getAllValues(), wenn die Methode mehrmals aufgerufen wird. Die Methode gibt eine Liste aller erfassten Werte in der Reihenfolge ihrer Aufrufe zurück.

verify(emailService, times(3)).send(emailCaptor.capture());
List<EmailMessage> messages = emailCaptor.getAllValues();
assertEquals(3, messages.size());
assertEquals("Confirmation", messages.get(0).getSubject());

Mockito-Spies: Partielles Mocking

Mockito.spy() umschließt ein echtes Objekt. Alle Methoden verhalten sich normal, sofern Sie sie nicht ausdrücklich stubben. Verwenden Sie Spies, wenn Sie eine Klasse testen müssen, die einige schwer testbare Abhängigkeiten hat, ansonsten aber wie erwartet funktioniert.

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-Annotation

Verwenden Sie @Spy zusammen mit @ExtendWith(MockitoExtension.class), um Spies zu erstellen. Das Feld muss initialisiert werden – entweder inline oder über @Spy UserService svc = new UserService(repo);.

@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
    @Spy
    OrderService orderService = new OrderService(mockRepo, mockEmail);
}

Spring-Beans mit @SpyBean überwachen

In Spring-Boot-Tests umschließt @SpyBean eine vorhandene Spring-Bean mit einem Mockito-Spy – das echte Verhalten bleibt erhalten, sofern es nicht gestubbt wird. Die Annotation wird zusammen mit @SpringBootTest verwendet.

@SpringBootTest
class IntegrationTest {
    @SpyBean EmailService emailService;
    @Test
    void order_sends_email() {
        orderService.placeOrder(cart);
        verify(emailService).sendConfirmation(any());
    }
}

doReturn statt when().thenReturn() bei Spies

Verwenden Sie bei Spies doReturn(value).when(spy).method() statt when(spy.method()).thenReturn(value). Die Form when(spy.method()) ruft tatsächlich die echte Methode auf, was Nebenwirkungen verursachen kann.

// 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!

Keine Interaktionen überprüfen

Verwenden Sie verifyNoInteractions(mock), um zu prüfen, dass ein Mock nie aufgerufen wurde, und verifyNoMoreInteractions(mock) nach allen erwarteten Aufrufen, um unerwartete Aufrufe zu erkennen.

verifyNoInteractions(emailService); // never called
verify(repo).save(any());
verifyNoMoreInteractions(repo); // save() was the only interaction

Überprüfung der Aufrufreihenfolge mit InOrder

Verwenden Sie InOrder, um zu überprüfen, dass gemockte Methoden in einer bestimmten Reihenfolge aufgerufen wurden.

InOrder inOrder = inOrder(repo, emailService);
inOrder.verify(repo).save(any());
inOrder.verify(emailService).send(any()); // save happened BEFORE send

Argument-Matcher

Kombinieren Sie Captors mit Matchern: any(), eq(), anyString(), argThat(predicate). Wenn ein Argument einen Matcher verwendet, müssen alle Argumente Matcher verwenden.

verify(repo).save(argThat(user ->
    user.getEmail().endsWith("@example.com") &&
    user.getStatus() == UserStatus.ACTIVE));

Kurzer Test

Warum sollten Sie beim Stubbing eines Spys doReturn statt when().thenReturn() verwenden?

Zusammenfassung

ArgumentCaptor erfasst Argumente, damit Sie sie nach dem Aufruf überprüfen können. Spies umschließen echte Objekte und delegieren an diese, sofern sie nicht gestubbt werden. Verwenden Sie doReturn für Spies und @SpyBean für Spring-Integrationstests. Überprüfen Sie die Aufrufreihenfolge mit InOrder.

Kostenlos starten

Lerne Java mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
104
Lektionen
374

Häufig gestellte Fragen

Ist die Lektion „Mockito für Fortgeschrittene: Argument-Captoren und Spies“ kostenlos?

Ja — der vollständige Text von „Mockito für Fortgeschrittene: Argument-Captoren und Spies“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Mockito für Fortgeschrittene: Argument-Captoren und Spies“?

Fangen Sie Methodenargumente mit ArgumentCaptor ab und simulieren Sie echte Objekte mit Mockito.spy teilweise. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Mockito für Fortgeschrittene: Argument-Captoren und Spies“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Parametrisierte Tests mit @CsvSource und @MethodSource
  2. Mockito für Fortgeschrittene: Argument-Captoren und Spies
  3. Spring-Boot-Test-Slices: @WebMvcTest und @DataJpaTest
  4. Testcontainers: Integrationstests mit echter Datenbank
← Zurück zu Java Academy