0Pricing
Testing Mastery: JUnit, Mockito & Integration Tests · レッスン

例外テストとタイムアウト

想定した例外を検証し、無限ループや長時間実行されるテストケースを防ぐタイムアウトを実装します。

「例外テストとタイムアウト」はCoddyKit上の無料Testing Mastery: JUnit, Mockito & Integration Testsレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTesting Mastery: JUnit, Mockito & Integration Tests学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Testing Mastery: JUnit, Mockito & Integration Testsコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

Test for Expected Errors

Sometimes, your code is designed to throw an error under specific, invalid conditions. For example, dividing by zero. Exception testing ensures that your code handles these situations correctly.

  • It validates both the success and failure paths.
  • It confirms your error messages are accurate.

Catching Exceptions with JUnit

JUnit 5 provides the assertThrows method to verify that a specific exception is thrown. This is the recommended and cleanest way to test for expected exceptions.

  • It takes the expected exception type (e.g., IllegalArgumentException.class).
  • It takes a lambda expression (a small piece of code) that should trigger the exception.

`assertThrows` in Action

Let's see assertThrows in a simple test. Our Calculator method divide should throw an IllegalArgumentException if the divisor is zero.

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);
        });
    }
}

Checking Exception Details

It's often not enough to just know *that* an exception was thrown. You might also want to verify its details, like the exception message or other properties.

The assertThrows method returns the actual exception object, allowing you to perform further assertions on it.

Asserting Exception Message

Here, we capture the exception object returned by assertThrows and then use assertEquals to verify its message. This makes your exception tests very precise.

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());
    }
}

Preventing Endless Tests with Timeouts

Sometimes, a piece of code can get stuck in an infinite loop or take an unexpectedly long time to complete. This can cause your test suite to hang indefinitely.

Timeouts are a crucial feature that automatically fail a test if it exceeds a specified duration, ensuring your test suite runs efficiently.

Setting Timeouts with `@Timeout`

JUnit 5 uses the @Timeout annotation to set a maximum duration for test methods or entire test classes. You specify the maximum value and a unit of time.

  • Common units include TimeUnit.SECONDS, TimeUnit.MILLISECONDS, TimeUnit.MINUTES.
  • If the test runs longer than the specified time, it will fail.

Method-Level Timeout Example

Here's how to apply a timeout to a single test method. If the longRunningTask() takes more than 1 second, this test will automatically fail.

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)");
    }
}

Class-Level Timeouts

You can also apply the @Timeout annotation at the class level. When placed on a test class, all test methods within that class will inherit the specified timeout.

If a test method also has its own @Timeout annotation, the method-level timeout will override the class-level one for that specific method.

Test Your Knowledge

Which JUnit 5 feature is best suited to ensure a test method completes execution within a predefined time limit, failing if it exceeds that limit?

Recap: Exceptions & Timeouts

In this lesson, you learned to write robust tests for expected errors and to prevent runaway tests:

  • You used assertThrows to verify that specific exceptions are thrown by your code.
  • You learned how to verify specific details of an exception, such as its message.
  • You applied the @Timeout annotation to set time limits for your test methods and classes, ensuring efficient test execution.

よくある質問

「例外テストとタイムアウト」レッスンは無料ですか?

はい。「例外テストとタイムアウト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Testing Mastery: JUnit, Mockito & Integration Testsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Testing Mastery: JUnit, Mockito & Integration Testsコースには全4レッスンが含まれています。

「例外テストとタイムアウト」で何を学びますか?

想定した例外を検証し、無限ループや長時間実行されるテストケースを防ぐタイムアウトを実装します。 ブラウザで直接実行するハンズオンコードでTesting Mastery: JUnit, Mockito & Integration Testsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Testing Mastery: JUnit, Mockito & Integration Testsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTesting Mastery: JUnit, Mockito & Integration Testsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「例外テストとタイムアウト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTesting Mastery: JUnit, Mockito & Integration Testsレッスンでコードを書いて実行できますか?

はい。すべてのTesting Mastery: JUnit, Mockito & Integration Testsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. テストのライフサイクルと実行順序
  2. パラメータ化テストと動的テスト
  3. 例外テストとタイムアウト
  4. 条件付きテストとアサンプション
← Testing Mastery: JUnit, Mockito & Integration Testsに戻る