Stubbing av returverdier
Konfigurer mock-objekter til å returnere bestemte verdier eller kaste unntak når metodene deres kalles.
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!
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
- Stubbing av returverdier
- Argumentmatchere i Mockito
- Spionering på ekte objekter
- Kasting av exceptions og påfølgende kall