Testing i praksis: JUnit, Mockito og integrasjonstester · leksjon

Testing av unntak og tidsavbrudd

Verifiser forventede unntak, og implementer tidsavbrudd for å forhindre uendelige løkker eller langvarige testtilfeller.

Leksjon 3 av 411 trinn

Testing av unntak og tidsavbrudd 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.

Teste forventede feil

Noen ganger er koden utformet slik at den skal kaste en feil under bestemte, ugyldige forhold. Et eksempel er divisjon med null. Unntakstesting sikrer at koden håndterer slike situasjoner på riktig måte.

  • Den validerer både stier for vellykket og mislykket kjøring.
  • Den bekrefter at feilmeldingene er korrekte.

Fange unntak med JUnit

JUnit 5 tilbyr metoden assertThrows for å bekrefte at et bestemt unntak kastes. Dette er den anbefalte og ryddigste måten å teste forventede unntak på.

  • Den tar imot typen unntak som forventes (for eksempel IllegalArgumentException.class).
  • Den tar imot et lambda-uttrykk (en liten kodestump) som skal utløse unntaket.

`assertThrows` i praksis

La oss se på assertThrows i en enkel test. Calculator-metoden divide skal kaste et IllegalArgumentException hvis divisoren er null.

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class Calculator {
    public int divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Divisor cannot be zero");
        }
        return a / b;
    }
}

public class ExceptionTest {
    @Test
    void testDivideByZeroThrowsException() {
        Calculator calc = new Calculator();
        assertThrows(IllegalArgumentException.class, () -> {
            calc.divide(10, 0);
        });
    }
}

Kontrollere detaljer om unntak

Det er ofte ikke nok å bare vite *at* et unntak ble kastet. De vil kanskje også kontrollere detaljene, for eksempel unntaksmeldingen eller andre egenskaper.

Metoden assertThrows returnerer selve unntaksobjektet, slik at De kan utføre flere kontrollpåstander på det.

Kontrollere unntaksmeldingen

Her henter vi unntaksobjektet som assertThrows returnerer, og bruker deretter assertEquals til å kontrollere meldingen. Dette gjør unntakstestene svært presise.

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class Calculator {
    public int divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Divisor cannot be zero");
        }
        return a / b;
    }
}

public class ExceptionMessageTest {
    @Test
    void testDivideByZeroMessage() {
        Calculator calc = new Calculator();
        IllegalArgumentException thrown = assertThrows(
            IllegalArgumentException.class,
            () -> calc.divide(10, 0),
            "Expected divide() to throw, but it didn't"
        );
        assertEquals("Divisor cannot be zero", thrown.getMessage());
    }
}

Forhindre endeløse tester med tidsavbrudd

Noen ganger kan en kodestump bli sittende fast i en uendelig løkke eller bruke uventet lang tid på å fullføre. Dette kan føre til at testpakken henger på ubestemt tid.

Tidsavbrudd er en viktig funksjon som automatisk feiler en test hvis den overskrider en angitt varighet, slik at testpakken kjører effektivt.

Angi tidsavbrudd med `@Timeout`

JUnit 5 bruker annotasjonen @Timeout til å angi maksimal varighet for testmetoder eller hele testklasser. De angir maksimal value og en tidsenhet, unit.

  • Vanlige enheter omfatter TimeUnit.SECONDS, TimeUnit.MILLISECONDS og TimeUnit.MINUTES.
  • Hvis testen kjører lenger enn den angitte tiden, vil den feile.

Eksempel på tidsavbrudd på metodenivå

Slik bruker De et tidsavbrudd på én testmetode. Hvis longRunningTask() bruker mer enn ett sekund, vil denne testen automatisk feile.

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
import java.util.concurrent.TimeUnit;
import static org.junit.jupiter.api.Assertions.*;

public class TimeoutMethodTest {

    // A method that might take too long
    private void longRunningTask() throws InterruptedException {
        Thread.sleep(1500); // Simulates a task taking 1.5 seconds
    }

    @Test
    @Timeout(value = 1, unit = TimeUnit.SECONDS)
    void testTaskShouldCompleteWithinOneSecond() throws InterruptedException {
        longRunningTask(); // This will cause the test to fail due to timeout
        assertTrue(true, "Task completed (but it will timeout)");
    }
}

Tidsavbrudd på klassenivå

De kan også bruke annotasjonen @Timeout på klassenivå. Når den plasseres på en testklasse, arver alle testmetodene i klassen det angitte tidsavbruddet.

Hvis en testmetode også har sin egen @Timeout-annotasjon, overstyrer tidsavbruddet på metodenivå det som er angitt på klassenivå, for denne metoden.

Test kunnskapene Deres

Hvilken JUnit 5-funksjon egner seg best for å sikre at en testmetode fullfører innen en forhåndsdefinert tidsgrense, og feiler hvis den overskrides?

Oppsummering: Unntak og tidsavbrudd

I denne leksjonen har De lært å skrive robuste tester for forventede feil og forhindre tester som løper løpsk:

  • De brukte assertThrows til å bekrefte at bestemte unntak kastes av koden.
  • De lærte hvordan De kan kontrollere bestemte detaljer ved et unntak, for eksempel meldingen.
  • De brukte annotasjonen @Timeout til å angi tidsgrenser for testmetoder og testklasser, slik at testene kjører effektivt.
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 «Testing av unntak og tidsavbrudd» gratis?

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

Verifiser forventede unntak, og implementer tidsavbrudd for å forhindre uendelige løkker eller langvarige testtilfeller. 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 «Testing av unntak og tidsavbrudd»?

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. Testlivssyklus og rekkefølge
  2. Parametriserte og dynamiske tester
  3. Testing av unntak og tidsavbrudd
  4. Betingede tester og antakelser
← Tilbake til Testing i praksis: JUnit, Mockito og integrasjonstester