Mestrer test: JUnit, Mockito og integrationstest · Lektion

Stubning af returværdier

Konfigurér mock-objekter til at returnere bestemte værdier eller kaste exceptions, når deres metoder kaldes.

Lektion 1 af 411 trin

Stubning af returværdier er en gratis Mestrer test: JUnit, Mockito og integrationstest-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Mestrer test: JUnit, Mockito og integrationstest, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Mestrer test: JUnit, Mockito og integrationstest-kurset indeholder 4 lektioner i alt.

Introduktion til stubbing af mocks

Når du opretter et mock-objekt, har det ingen faktisk adfærd. Dets metoder gør som standard ingenting og returnerer ofte null, 0 eller tomme samlinger.

Stubbing er processen, hvor du lærer et mock-objekt, hvordan det skal reagere på bestemte metodekald. Det svarer til at give din mock et manuskript, den skal følge!

Det giver dig mulighed for at styre de nøjagtige betingelser for dine tests, så den kode, du faktisk tester, isoleres.

Få mocks til at returnere værdier

Den mest almindelige måde at stubbe et mock på er at bruge when().thenReturn(). Det fortæller Mockito: "Når denne bestemte metode kaldes på mocken, skal denne foruddefinerede værdi returneres."

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

value kan være et vilkårligt objekt eller en primitiv type, der passer til metodens returtype.

Kodeeksempel med thenReturn()

Prøv at køre dette enkle eksempel. Bemærk, hvordan mockens add-metode kun returnerer vores stubbeværdi, når den kaldes 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));
    }
}

Mocks, der udløser fejl

Nogle gange skal du teste, hvordan din kode håndterer fejl. Du kan konfigurere en mock til at udløse en undtagelse, når en bestemt metode kaldes, ved hjælp af when().thenThrow().

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

Det er afgørende for at teste fejlhåndteringsforløb og sikre, at din applikation håndterer uventede situationer på en god måde.

Kodeeksempel med thenThrow()

I dette eksempel er vores DataService-mock konfigureret til at udløse en IllegalArgumentException, hvis vi forsøger at hente data med et "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()

Hvad nu hvis du har brug for, at mockens svar afhænger af de argumenter, der sendes til den, eller at den udfører en tilpasset logik?

when().thenAnswer() er løsningen. Den tager imod et Answer-objekt (ofte en lambda eller en anonym klasse), som giver dig mere kontrol:

  • Du får adgang til de faktiske metodeargumenter.
  • Du kan udføre beregninger eller kompleks logik.
  • Du kan returnere en værdi eller udløse en undtagelse dynamisk.

Kodeeksempel med thenAnswer()

Her udfører metoden multiply på vores mock faktisk multiplikationen baseret på de argumenter, den modtager. Det er mere dynamisk end en fast returværdi.

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 returværdier: Kædning

Hvad nu hvis du vil have, at en mock-metode returnerer forskellige værdier ved efterfølgende kald?

Mockito giver dig mulighed for at kæde stubbing-metoder. Du kan angive flere returværdier til thenReturn() eller kæde flere kald til thenReturn(), thenThrow() eller thenAnswer().

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

Når alle angivne værdier eller handlinger er brugt, gentages den sidste ved efterfølgende kald.

Demonstration af kædet stubbing

Observer, hvordan vores mock Queue returnerer "Item A", derefter "Item B" og så udløser en undtagelse ved efterfølgende kald 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());
        }
    }
}

Tjek din forståelse

Du tester en metode, der behandler elementer fra en kø. Du skal have køens poll()-metode til at returnere "Task 1", derefter "Task 2" og til sidst null (som angiver en tom kø) ved efterfølgende kald. Hvilken stubbing-metode i Mockito vil du bruge?

Opsummering: Stubbing af returværdier

I denne lektion lærte du, hvordan du styrer dine mock-objekters adfærd ved at stubbe deres metodekald. Det er grundlæggende for at isolere enheden under test og skabe forudsigelige testmiljøer.

  • when().thenReturn(): Får en mock-metode til at returnere en bestemt værdi.
  • when().thenThrow(): Får en mock-metode til at udløse en undtagelse.
  • when().thenAnswer(): Giver dynamiske svar baseret på metodeargumenter eller tilpasset logik.
  • Kædning: Definerer en sekvens af forskellige adfærdsmønstre for efterfølgende kald til den samme metode.

Nu skal vi se nærmere på Romeos argumentmatchere, så du kan lave endnu mere fleksibel stubbing og verificering!

Gratis at komme i gang

Lær Mestrer test: JUnit, Mockito og integrationstest med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Stubning af returværdier” gratis?

Ja — alle 3 lektioner i læringssporet Mestrer test: JUnit, Mockito og integrationstest, inklusive “Stubning af returværdier”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Mestrer test: JUnit, Mockito og integrationstest-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Stubning af returværdier”?

Konfigurér mock-objekter til at returnere bestemte værdier eller kaste exceptions, når deres metoder kaldes. Du øver dig i Mestrer test: JUnit, Mockito og integrationstest med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Mestrer test: JUnit, Mockito og integrationstest?

Der kræves ingen tidligere erfaring. Mestrer test: JUnit, Mockito og integrationstest på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Stubning af returværdier”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Mestrer test: JUnit, Mockito og integrationstest-lektion?

Ja. Alle Mestrer test: JUnit, Mockito og integrationstest-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Stubning af returværdier
  2. Mockito-argumentmatchere
  3. Spionering på rigtige objekter
  4. Kastning af exceptions og konsekutive kald
← Tilbage til Mestrer test: JUnit, Mockito og integrationstest