Testing i praksis: JUnit, Mockito og integrasjonstester · leksjon

Verifisering av mock-interaksjoner

Lær å verifisere at mock-objekter ble kalt med forventede argumenter og et bestemt antall ganger.

Leksjon 3 av 411 trinn

Verifisering av mock-interaksjoner er en gratis leksjon i Testing i praksis: JUnit, Mockito og integrasjonstester på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Testing i praksis: JUnit, Mockito og integrasjonstester, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Testing i praksis: JUnit, Mockito og integrasjonstester inneholder totalt 4 leksjoner.

Introduksjon til verifisering i Mockito

Velkommen til verifisering av samhandling med mockobjekter! Etter at du har lært å opprette mockobjekter, er neste viktige trinn å kontrollere hvordan de ble brukt.

Verifisering i Mockito betyr å kontrollere om bestemte metoder på mockobjektene dine ble kalt under en test.

Hvorfor verifisere samhandling?

Når du tester en klasse, vil du ofte forsikre deg om at den samhandler riktig med avhengighetene sine.

  • Kontroll av samarbeid: Kaller objektet som testes, de riktige metodene på samarbeidspartnerne sine?
  • Bekrefte oppførsel: Sendte det de riktige argumentene til disse metodene?
  • Antall kall: Ble en metode kalt én gang, flere ganger eller ikke i det hele tatt?

Verifisering besvarer disse spørsmålene og sikrer at koden oppfører seg som forventet.

Den grunnleggende metoden `verify()`

Den enkleste måten å verifisere en samhandling på er å bruke Mockito.verify(). Den kontrollerer om en metode ble kalt nøyaktig én gang.

Du skriver verify(mockObject).methodCall(); etter at koden som testes, er kjørt. Hvis metoden ikke ble kalt, eller ble kalt mer enn én gang, vil Mockito utløse en feil.

Kode: Grunnleggende bruk av `verify()`

Prøv dette kjørbare eksempelet. Vi simulerer en test ved å opprette et mockobjekt og kalle en metode på det. Deretter verifiserer vi samhandlingen.

I en ekte JUnit-test vil en mislykket verifisering føre til at testen mislykkes.

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.");
    }
}

Verifisere bestemte argumenter med `eq()`

Ofte må du kontrollere ikke bare om en metode ble kalt, men også med hvilke argumenter.

Bruk eq(value) for å samsvare med en nøyaktig argumentverdi. For eksempel sikrer verify(mock).someMethod(eq("hello"), eq(123)); at metoden ble kalt med "hello" og 123.

Du kan også bruke generiske matchere som anyString() eller anyInt() hvis du ikke bryr deg om verdien til et bestemt argument.

Kode: `verify()` med `eq()`

Her verifiserer vi at en melding ble sendt med et bestemt innhold og en bestemt prioritet. Legg merke til hvordan eq() hjelper oss med å være presise.

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.");
    }
}

Verifisere antall kall: `times()` og `never()`

Noen ganger må du verifisere hvor mange ganger en metode ble kalt:

  • verify(mock, times(N)).method();: Kalt nøyaktig N ganger.
  • verify(mock, never()).method();: Aldri kalt (det samme som times(0)).

Dette er nyttig for å sikre at løkker, betingelser eller feilhåndtering fungerer riktig.

Kode: `times()` og `never()`

Dette eksempelet behandler flere hendelser og logger en feil. Vi verifiserer nøyaktig hvor mange ganger hver type logg ble opprettet.

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.");
    }
}

Fleksibelt antall kall: `atLeast()` og `atMost()`

Noen ganger er det ikke nødvendig med et nøyaktig antall, men et intervall er viktig:

  • verify(mock, atLeast(N)).method();: Kalt N eller flere ganger.
  • verify(mock, atMost(N)).method();: Kalt N eller færre ganger.

Det finnes også praktiske kortformer: atLeastOnce() og atMostOnce(), som gjør koden tydeligere.

Kontroll av verifisering av samhandling

Hvilke av alternativene nedenfor er gyldige måter å verifisere metodekall på ved hjelp av Mockito?

Oppsummering: Bli god på verifisering

Du har lært hvordan du verifiserer samhandling med mockobjekter i Mockito!

  • verify(mock).method(); kontrollerer at et kall ble gjort én gang.
  • Bruk eq() for nøyaktig samsvar med argumenter eller generiske matchere som anyString().
  • Kontroller antall kall med times(N), never(), atLeast(N) og atMost(N).

Å beherske verifisering er avgjørende for å kunne skrive robuste og pålitelige enhetstester som bekrefter presis samhandling mellom objekter.

Gratis å komme i gang

Lær deg Testing i praksis: JUnit, Mockito og integrasjonstester med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Verifisering av mock-interaksjoner» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Testing i praksis: JUnit, Mockito og integrasjonstester, inkludert «Verifisering av mock-interaksjoner», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Testing i praksis: JUnit, Mockito og integrasjonstester inneholder totalt 4 leksjoner.

Hva lærer jeg i «Verifisering av mock-interaksjoner»?

Lær å verifisere at mock-objekter ble kalt med forventede argumenter og et bestemt antall ganger. Du øver på Testing i praksis: JUnit, Mockito og integrasjonstester med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Testing i praksis: JUnit, Mockito og integrasjonstester?

Ingen tidligere erfaring er nødvendig. Testing i praksis: JUnit, Mockito og integrasjonstester på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Verifisering av mock-interaksjoner»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Testing i praksis: JUnit, Mockito og integrasjonstester-leksjonen?

Ja. Alle Testing i praksis: JUnit, Mockito og integrasjonstester-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Mocker, stubber og faker
  2. Oppretting av mocker med Mockito
  3. Verifisering av mock-interaksjoner
  4. Injisering av mocks med @Mock og @InjectMocks
← Tilbake til Testing i praksis: JUnit, Mockito og integrasjonstester