Test af exceptions og timeouts
Verificér forventede exceptions, og implementér timeouts for at forhindre uendelige løkker eller langvarige testsager.
Test af exceptions og timeouts er en gratis Mestrer test: JUnit, Mockito og integrationstest-lektion på CoddyKit. Dette er lektion 3 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.
Test af forventede fejl
Nogle gange er din kode designet til at kaste en fejl under bestemte ugyldige betingelser, f.eks. division med nul. Test af undtagelser sikrer, at din kode håndterer disse situationer korrekt.
- Den validerer både succes- og fejlhåndteringsforløbene.
- Den bekræfter, at dine fejlmeddelelser er korrekte.
Fang undtagelser med JUnit
JUnit 5 indeholder metoden assertThrows, som kan bekræfte, at en bestemt undtagelse bliver kastet. Det er den anbefalede og mest enkle måde at teste forventede undtagelser på.
- Den modtager den forventede undtagelsestype (f.eks.
IllegalArgumentException.class). - Den modtager et lambda-udtryk (et lille stykke kode), som skal udløse undtagelsen.
`assertThrows` i praksis
Lad os se assertThrows i en simpel test. Metoden divide i vores Calculator skal kaste en IllegalArgumentException, hvis divisoren er nul.
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);
});
}
}Kontrol af undtagelsesdetaljer
Det er ofte ikke nok bare at vide, at der blev kastet en undtagelse. Du vil måske også kontrollere dens detaljer, f.eks. undtagelsesmeddelelsen eller andre egenskaber.
Metoden assertThrows returnerer det faktiske undtagelsesobjekt, så du kan udføre flere påstande på det.
Kontrol af undtagelsesmeddelelsen
Her gemmer vi undtagelsesobjektet, som assertThrows returnerer, og bruger derefter assertEquals til at kontrollere dets meddelelse. Det gør dine tests af undtagelser meget præcise.
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());
}
}Undgå uendelige tests med tidsgrænser
Nogle gange kan et stykke kode sidde fast i en uendelig løkke eller tage uventet lang tid at afslutte. Det kan få din testsamling til at hænge på ubestemt tid.
Tidsgrænser er en vigtig funktion, der automatisk får en test til at fejle, hvis den overskrider en angivet varighed, så din testsamling kan køre effektivt.
Angiv tidsgrænser med `@Timeout`
JUnit 5 bruger annoteringen @Timeout til at angive en maksimal varighed for testmetoder eller hele testklasser. Du angiver den maksimale value og en tidsmæssig unit.
- Almindelige enheder omfatter
TimeUnit.SECONDS,TimeUnit.MILLISECONDSogTimeUnit.MINUTES. - Hvis testen kører længere end den angivne tid, vil den fejle.
Eksempel på tidsgrænse for en metode
Sådan anvender du en tidsgrænse på en enkelt testmetode. Hvis longRunningTask() tager mere end 1 sekund, vil denne test automatisk fejle.
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)");
}
}Tidsgrænser på klasseniveau
Du kan også anvende annoteringen @Timeout på klasseniveau. Når den placeres på en testklasse, nedarver alle testmetoder i klassen den angivne tidsgrænse.
Hvis en testmetode også har sin egen annotering med @Timeout, tilsidesætter tidsgrænsen på metodenniveau klassens tidsgrænse for den pågældende metode.
Test din viden
Hvilken funktion i JUnit 5 er bedst egnet til at sikre, at en testmetode afslutter inden for en foruddefineret tidsgrænse og fejler, hvis den overskrides?
Opsummering: Undtagelser og tidsgrænser
I denne lektion lærte du at skrive robuste tests for forventede fejl og forhindre tests i at løbe løbsk:
- Du brugte
assertThrowstil at bekræfte, at din kode kaster bestemte undtagelser. - Du lærte, hvordan du kontrollerer bestemte detaljer i en undtagelse, f.eks. dens meddelelse.
- Du anvendte annoteringen
@Timeouttil at angive tidsgrænser for dine testmetoder og testklasser, så testkørslen bliver effektiv.
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 “Test af exceptions og timeouts” gratis?
Ja — alle 3 lektioner i læringssporet Mestrer test: JUnit, Mockito og integrationstest, inklusive “Test af exceptions og timeouts”, 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 “Test af exceptions og timeouts”?
Verificér forventede exceptions, og implementér timeouts for at forhindre uendelige løkker eller langvarige testsager. 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 3 af 4.
Hvor lang tid tager lektionen “Test af exceptions og timeouts”?
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
- Testlivscyklus og rækkefølge
- Parametriserede og dynamiske tests
- Test af exceptions og timeouts
- Betingede tests og assumptions