Testen beheersen: JUnit, Mockito en integratietesten · Les

Interacties met mocks verifiëren

Leer verifiëren dat mockobjecten met de verwachte argumenten en een specifiek aantal keer zijn aangeroepen.

Les 3 van 411 stappen

Interacties met mocks verifiëren is een gratis Testen beheersen: JUnit, Mockito en integratietesten-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Testen beheersen: JUnit, Mockito en integratietesten. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Testen beheersen: JUnit, Mockito en integratietesten bevat in totaal 4 lessen.

Introductie tot verificatie met Mockito

Welkom bij het verifiëren van interacties met mocks! Nadat je hebt geleerd hoe je mocks maakt, is de volgende belangrijke stap controleren hoe ze zijn gebruikt.

Verificatie in Mockito betekent controleren of specifieke methoden van je mockobjecten tijdens een test zijn aangeroepen.

Waarom interacties verifiëren?

Wanneer je een klasse test, wil je vaak controleren of deze correct communiceert met haar afhankelijkheden.

  • Samenwerking controleren: Heeft het geteste object de juiste methoden op zijn samenwerkende objecten aangeroepen?
  • Gedrag bevestigen: Heeft het de juiste argumenten aan die methoden doorgegeven?
  • Aantal interacties: Is een methode één keer, meerdere keren of helemaal niet aangeroepen?

Met verificatie krijg je antwoord op deze vragen en zorg je ervoor dat je code zich gedraagt zoals verwacht.

De basismethode `verify()`

De eenvoudigste manier om een interactie te verifiëren is met Mockito.verify(). Hiermee controleer je of een methode precies één keer is aangeroepen.

Je schrijft verify(mockObject).methodCall(); nadat de te testen code is uitgevoerd. Als de methode niet of meer dan één keer is aangeroepen, genereert Mockito een fout.

Code: `verify()` in actie

Probeer dit uitvoerbare voorbeeld. We simuleren een test door een mock te maken en er een methode op aan te roepen. Vervolgens verifiëren we de interactie.

In een echte JUnit-test zou een mislukte verificatie ervoor zorgen dat de test mislukt.

import static org.mockito.Mockito.*;

interface MyService {
    void doSomething();
}

class MyProcessor {
    private MyService service;
    public MyProcessor(MyService service) {
        this.service = service;
    }
    public void execute() {
        service.doSomething();
    }
}

public class Main {
    public static void main(String[] args) {
        MyService mockService = mock(MyService.class);
        MyProcessor processor = new MyProcessor(mockService);

        System.out.println("Calling execute...");
        processor.execute(); // This calls mockService.doSomething()

        try {
            // Verify doSomething() was called exactly once
            verify(mockService).doSomething();
            System.out.println("\nVerification successful: doSomething() called once.");
        } catch (Throwable e) {
            System.out.println("\nVerification failed: " + e.getMessage());
        }
        System.out.println("Program finished.");
    }
}

Specifieke argumenten verifiëren met `eq()`

Vaak moet je niet alleen controleren of een methode is aangeroepen, maar ook met welke argumenten.

Gebruik eq(value) om een exacte argumentwaarde te matchen. Met bijvoorbeeld verify(mock).someMethod(eq("hello"), eq(123)); controleer je of de methode is aangeroepen met "hello" en 123.

Je kunt ook algemene matchers gebruiken, zoals anyString() of anyInt(), als de specifieke waarde van een argument niet belangrijk is.

Code: `verify()` met `eq()`

Hier verifiëren we dat een bericht met specifieke inhoud en prioriteit is verzonden. Let erop hoe eq() ons helpt om precies te zijn.

import static org.mockito.Mockito.*;

interface DataSender {
    void send(String message, int priority);
}

class MessageProcessor {
    private DataSender sender;
    public MessageProcessor(DataSender sender) {
        this.sender = sender;
    }
    public void processAndSend(String data) {
        sender.send(data.toUpperCase(), 1);
    }
}

public class Main {
    public static void main(String[] args) {
        DataSender mockSender = mock(DataSender.class);
        MessageProcessor processor = new MessageProcessor(mockSender);

        System.out.println("Processing 'hello' message...");
        processor.processAndSend("hello");

        try {
            // Verify send() was called with "HELLO" and 1
            verify(mockSender).send(eq("HELLO"), eq(1));
            System.out.println("\nVerification successful: Correct arguments received.");
        } catch (Throwable e) {
            System.out.println("\nVerification failed: " + e.getMessage());
        }

        // The following commented block shows a failing verification
        // try {
        //     verify(mockSender).send(eq("hello"), eq(1)); // "hello" (lowercase) is wrong
        //     System.out.println("This should not be printed.");
        // } catch (Throwable e) {
        //     System.out.println("Expected failure for wrong arguments: " + e.getMessage());
        // }
        System.out.println("Program finished.");
    }
}

Aantal aanroepen verifiëren: `times()` en `never()`

Soms moet je verifiëren hoe vaak een methode is aangeroepen:

  • verify(mock, times(N)).method();: Precies N keer aangeroepen.
  • verify(mock, never()).method();: Nooit aangeroepen, hetzelfde als times(0).

Deze opties zijn nuttig om te controleren of lussen, voorwaarden of foutafhandeling correct werken.

Code: `times()` en `never()`

Dit voorbeeld verwerkt meerdere gebeurtenissen en logt een fout. We verifiëren precies hoe vaak elk type logbericht is gemaakt.

import static org.mockito.Mockito.*;

interface EventLogger {
    void log(String event);
}

class EventProcessor {
    private EventLogger logger;
    public EventProcessor(EventLogger logger) {
        this.logger = logger;
    }
    public void processEvents(int count) {
        for (int i = 0; i < count; i++) {
            logger.log("Event " + (i + 1));
        }
    }
    public void logError(String error) {
        logger.log("ERROR: " + error);
    }
}

public class Main {
    public static void main(String[] args) {
        EventLogger mockLogger = mock(EventLogger.class);
        EventProcessor processor = new EventProcessor(mockLogger);

        System.out.println("Processing 3 events and logging an error...");
        processor.processEvents(3);
        processor.logError("Failed to connect");

        try {
            // Verify log() was called 3 times with arguments starting with "Event "
            verify(mockLogger, times(3)).log(startsWith("Event "));
            System.out.println("\nVerification successful: 'Event' logged 3 times.");

            // Verify log() was called once with the exact error message
            verify(mockLogger, times(1)).log(eq("ERROR: Failed to connect"));
            System.out.println("Verification successful: Error logged once.");

            // Verify log() was never called with arguments starting with "WARNING"
            verify(mockLogger, never()).log(startsWith("WARNING"));
            System.out.println("Verification successful: 'WARNING' never logged.");

        } catch (Throwable e) {
            System.out.println("\nVerification failed: " + e.getMessage());
        }
        System.out.println("Program finished.");
    }
}

Flexibel aantal aanroepen: `atLeast()` en `atMost()`

Soms is een exact aantal niet nodig, maar is een bereik wel belangrijk:

  • verify(mock, atLeast(N)).method();: N keer of vaker aangeroepen.
  • verify(mock, atMost(N)).method();: N keer of minder aangeroepen.

Er zijn ook handige verkorte varianten: atLeastOnce() en atMostOnce(), die de bedoeling duidelijker maken.

Controle van interacties

Welke van de volgende opties zijn geldige manieren om methodeaanroepen met Mockito te verifiëren?

Samenvatting: verificatie beheersen

Je hebt geleerd hoe je interacties met mocks in Mockito verifieert!

  • verify(mock).method(); controleert of er één aanroep is gedaan.
  • Gebruik eq() voor het matchen van exacte argumenten of algemene matchers zoals anyString().
  • Beheer het aantal aanroepen met times(N), never(), atLeast(N) en atMost(N).

Verificatie beheersen is essentieel voor het schrijven van robuuste, betrouwbare tests van eenheden die nauwkeurige samenwerking tussen objecten bevestigen.

Gratis beginnen

Leer Testen beheersen: JUnit, Mockito en integratietesten 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
12
Lessen
48

Veelgestelde vragen

Is de les “Interacties met mocks verifiëren” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Testen beheersen: JUnit, Mockito en integratietesten, waaronder “Interacties met mocks verifiëren”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Testen beheersen: JUnit, Mockito en integratietesten bevat in totaal 4 lessen.

Wat leer ik in “Interacties met mocks verifiëren”?

Leer verifiëren dat mockobjecten met de verwachte argumenten en een specifiek aantal keer zijn aangeroepen. Je oefent met Testen beheersen: JUnit, Mockito en integratietesten 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 Testen beheersen: JUnit, Mockito en integratietesten te beginnen?

Ervaring vooraf is niet nodig. Testen beheersen: JUnit, Mockito en integratietesten 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 3 van 4.

Hoe lang duurt de les “Interacties met mocks verifiëren”?

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 Testen beheersen: JUnit, Mockito en integratietesten?

Ja. Elke les over Testen beheersen: JUnit, Mockito en integratietesten 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. Mocks, stubs en fakes
  2. Mocks maken met Mockito
  3. Interacties met mocks verifiëren
  4. Mocks injecteren met @Mock en @InjectMocks
← Terug naar Testen beheersen: JUnit, Mockito en integratietesten