Testing i praksis: JUnit, Mockito og integrasjonstester · leksjon

Stubbing av returverdier

Konfigurer mock-objekter til å returnere bestemte verdier eller kaste unntak når metodene deres kalles.

Leksjon 1 av 411 trinn

Stubbing av returverdier er en gratis leksjon i Testing i praksis: JUnit, Mockito og integrasjonstester på CoddyKit. Dette er leksjon 1 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 stubbing av mockobjekter

Når du oppretter et mockobjekt, har det ingen faktisk oppførsel. Metodene gjør som standard ingenting og returnerer ofte null, 0 eller tomme samlinger.

Stubbing er prosessen med å lære et mockobjekt hvordan det skal svare på bestemte metodekall. Det er som å gi mockobjektet et skript det skal følge!

Dette lar deg kontrollere de nøyaktige betingelsene for testene dine og isolere koden du faktisk tester.

Få mockobjekter til å returnere verdier

Den vanligste måten å stubbe et mockobjekt på er å bruke when().thenReturn(). Dette forteller Mockito: «Når denne bestemte metoden kalles på mockobjektet, skal denne forhåndsdefinerte verdien returneres.»

  • when(mock.someMethod()).thenReturn(value);

value kan være et hvilket som helst objekt eller en primitiv type som samsvarer med metodens returtype.

Kodeeksempel med thenReturn()

Prøv å kjøre dette enkle eksempelet. Legg merke til at mockobjektets add-metode bare returnerer den stubbede verdien når den kalles med (1, 1).

import static org.mockito.Mockito.*;

interface CalculatorService {
    int add(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        // Create a mock of CalculatorService
        CalculatorService mockCalc = mock(CalculatorService.class);

        // Stub the add(1, 1) method to return 5
        when(mockCalc.add(1, 1)).thenReturn(5);

        // Call the stubbed method
        System.out.println("1 + 1 = " + mockCalc.add(1, 1));

        // Call a method that was NOT stubbed
        System.out.println("2 + 2 = " + mockCalc.add(2, 2));
    }
}

Mockobjekter som utløser feil

Noen ganger må du teste hvordan koden håndterer feil. Du kan konfigurere et mockobjekt til å utløse et unntak når en bestemt metode kalles, ved å bruke when().thenThrow().

  • when(mock.failingMethod()).thenThrow(new SomeException("Error!"));

Dette er avgjørende for å teste feilbaner og sikre at programmet håndterer uventede situasjoner på en kontrollert måte.

Kodeeksempel med thenThrow()

I dette eksempelet er DataService-mockobjektet konfigurert til å utløse et IllegalArgumentException hvis vi prøver å hente data med en «invalid»-ID.

import static org.mockito.Mockito.*;

interface DataService {
    String fetchData(String id);
}

public class Main {
    public static void main(String[] args) {
        DataService mockData = mock(DataService.class);

        // Stub fetchData("invalid") to throw an exception
        when(mockData.fetchData("invalid"))
            .thenThrow(new IllegalArgumentException("ID not found!"));

        // Call a method that was NOT stubbed (returns null by default)
        System.out.println("Fetching 'valid': " + mockData.fetchData("valid"));

        // Call the stubbed method that throws an exception
        try {
            System.out.println("Fetching 'invalid': " + mockData.fetchData("invalid"));
        } catch (IllegalArgumentException e) {
            System.out.println("Caught error: " + e.getMessage());
        }
    }
}

Dynamiske svar: thenAnswer()

Hva om du trenger at mockobjektets svar skal avhenge av argumentene som sendes til det, eller at det skal utføre egendefinert logikk?

when().thenAnswer() er løsningen. Den tar et Answer-objekt (ofte en lambda eller en anonym klasse) som gir deg mer kontroll:

  • Du får tilgang til de faktiske metodeargumentene.
  • Du kan utføre beregninger eller kompleks logikk.
  • Du kan returnere en verdi eller utløse et unntak dynamisk.

Kodeeksempel med thenAnswer()

Her utfører multiply-metoden på mockobjektet faktisk multiplikasjonen basert på argumentene den mottar. Dette er mer dynamisk enn en fast returverdi.

import static org.mockito.Mockito.*;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

interface MathService {
    int multiply(int a, int b);
}

public class Main {
    public static void main(String[] args) {
        MathService mockMath = mock(MathService.class);

        // Stub multiply for any two integers to perform actual multiplication
        when(mockMath.multiply(anyInt(), anyInt())).thenAnswer(
            new Answer<Integer>() {
                public Integer answer(InvocationOnMock invocation) {
                    Object[] args = invocation.getArguments();
                    Integer arg1 = (Integer) args[0];
                    Integer arg2 = (Integer) args[1];
                    return arg1 * arg2; // Custom logic based on arguments
                }
            }
        );

        System.out.println("3 * 4 = " + mockMath.multiply(3, 4));
        System.out.println("5 * 2 = " + mockMath.multiply(5, 2));
        System.out.println("7 * 0 = " + mockMath.multiply(7, 0));
    }
}

Flere returverdier: Kjedet stubbing

Hva om du vil at en mockmetode skal returnere ulike verdier ved påfølgende kall?

Mockito lar deg kjede stubbing-metoder. Du kan oppgi flere returverdier til thenReturn(), eller kjede flere kall til thenReturn(), thenThrow() eller thenAnswer().

  • when(mock.method()).thenReturn(val1, val2, val3);
  • when(mock.method()).thenReturn(val1).thenThrow(ex).thenReturn(val3);

Når alle angitte verdier eller handlinger er brukt opp, blir den siste gjentatt ved påfølgende kall.

Demonstrasjon av kjedet stubbing

Legg merke til hvordan Queue-mockobjektet vårt først returnerer «Item A», deretter «Item B», og så utløser et unntak ved påfølgende kall til poll().

import static org.mockito.Mockito.*;
import java.util.Queue;
import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        Queue<String> mockQueue = mock(Queue.class);

        // Stub poll() to return different values/actions on successive calls
        when(mockQueue.poll())
            .thenReturn("Item A")
            .thenReturn("Item B")
            .thenThrow(new IllegalStateException("Queue is empty!"));

        System.out.println("Poll 1: " + mockQueue.poll()); // Returns "Item A"
        System.out.println("Poll 2: " + mockQueue.poll()); // Returns "Item B"

        try {
            System.out.println("Poll 3: " + mockQueue.poll()); // Throws exception
        } catch (IllegalStateException e) {
            System.out.println("Caught error on Poll 3: " + e.getMessage());
        }

        // Subsequent calls will repeat the last action (throw exception)
        try {
            System.out.println("Poll 4: " + mockQueue.poll());
        } catch (IllegalStateException e) {
            System.out.println("Caught error on Poll 4: " + e.getMessage());
        }
    }
}

Kontroller forståelsen din

Du tester en metode som behandler elementer fra en kø. Du trenger at køens poll()-metode først returnerer «Task 1», deretter «Task 2» og til slutt null (som angir en tom kø) ved påfølgende kall. Hvilken stubbing-tilnærming i Mockito vil du bruke?

Oppsummering: Stubbede returverdier

I denne leksjonen har du lært hvordan du kontrollerer oppførselen til mockobjekter ved å stubbe metodekallene deres. Dette er grunnleggende for å isolere enheten som testes og opprette forutsigbare testmiljøer.

  • when().thenReturn(): Får en mockmetode til å returnere en bestemt verdi.
  • when().thenThrow(): Får en mockmetode til å utløse et unntak.
  • when().thenAnswer(): Gir dynamiske svar basert på metodeargumenter eller egendefinert logikk.
  • Kjedet stubbing: Definerer en sekvens med ulik oppførsel for påfølgende kall til samme metode.

Deretter skal vi utforske argumentmatchere i Mockito for enda mer fleksibel stubbing og verifisering!

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 «Stubbing av returverdier» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Testing i praksis: JUnit, Mockito og integrasjonstester, inkludert «Stubbing av returverdier», 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 «Stubbing av returverdier»?

Konfigurer mock-objekter til å returnere bestemte verdier eller kaste unntak når metodene deres kalles. 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 1 av 4.

Hvor lang tid tar leksjonen «Stubbing av returverdier»?

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. Stubbing av returverdier
  2. Argumentmatchere i Mockito
  3. Spionering på ekte objekter
  4. Kasting av exceptions og påfølgende kall
← Tilbake til Testing i praksis: JUnit, Mockito og integrasjonstester