JavaのassertThrowsとは?例外が起きることをテストする考え方

最終更新日

Schoo Java入門 中級 第3回 単体テストによるビジネスロジック検証

本記事は、Schooの「Java入門 中級【2026年版】」第3回「単体テストによるビジネスロジック検証」を学ぶ前後に、JUnitの assertThrows の考え方を整理したい方向けの記事です。

assertEquals が戻り値を確認するためのものなら、assertThrows は例外が通知されることを確認するためのものです。不正な入力を渡したときに、想定どおり処理を止められるかをテストできます。

Schoo コースページ:Java入門 中級【2026年版】

assertThrowsは例外が通知されることを確認する

メソッドに不正な値を渡したとき、戻り値ではなく例外で知らせる設計にすることがあります。たとえば、購入金額に -1 を渡すようなケースです。

図解:assertThrowsは例外が通知されることを確認する
入力
-1
メソッドを実行
calculateFee(-1)
実際の動き
IllegalArgumentException
例外が通知される
期待
同じ例外
assertThrows は、不正な入力を渡したときに、期待した例外が通知されるかを確認します。

戻り値の確認と例外の確認を分けて考える

正常な入力では、メソッドが値を返します。この場合は assertEquals で期待値と実際の結果を比べます。

一方、不正な入力では、値を返すのではなく例外を通知することがあります。この場合は assertThrows を使います。

図解:assertEqualsとassertThrowsの使い分け
戻り値を確認する
assertEquals(500, actual);
計算結果や判定結果が返る場合
例外を確認する
assertThrows(…);
不正な値で処理を止める場合
正常な入力は戻り値を確認し、不正な入力は例外が通知されることを確認します。

assertThrowsの基本形

assertThrows では、第1引数に期待する例外クラスを書きます。第2引数には、例外が起きるはずの処理を書きます。

assertThrows(
    IllegalArgumentException.class,
    () -> calculator.calculateFee(-1)
);

このテストは、「calculator.calculateFee(-1) を実行すると、IllegalArgumentException が通知されるはず」という意味です。

例外が起きなければテストは失敗する

assertThrows は、例外が起きることを期待するテストです。そのため、例外が起きなかった場合はテスト失敗になります。

public int calculateFee(int amount) {
    if (amount < 0) {
        throw new IllegalArgumentException("購入金額は0円以上で指定してください。");
    }

    if (amount >= 5000) {
        return 0;
    }

    return 500;
}

このメソッドでは、amount が0未満の場合に IllegalArgumentException を通知します。したがって、-1 を渡すテストでは assertThrows を使えます。

例外メッセージも確認できる

assertThrows は、発生した例外オブジェクトを戻り値として受け取れます。これを使うと、例外メッセージまで確認できます。

図解:例外オブジェクトを受け取るとメッセージも確認できる
assertThrowsの戻り値
exception
メッセージを確認
exception.getMessage()
例外の種類だけでなく、必要に応じて例外メッセージまで確認できます。
IllegalArgumentException exception = assertThrows(
    IllegalArgumentException.class,
    () -> calculator.calculateFee(-1)
);

assertEquals("購入金額は0円以上で指定してください。", exception.getMessage());

例外の種類だけを確認したい場合は、最初の assertThrows だけでも確認できます。メッセージまで大切にしたい場合は、getMessage() の結果も確認します。

確認問題

次のメソッドについて、-1 を渡したときに IllegalArgumentException が通知されることを確認するテストを書いてください。

public int calculateFee(int amount) {
    if (amount < 0) {
        throw new IllegalArgumentException("購入金額は0円以上で指定してください。");
    }

    if (amount >= 5000) {
        return 0;
    }

    return 500;
}

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

まとめ

  • assertThrows は、期待した例外が通知されるかを確認する
  • 第1引数には期待する例外クラスを書く
  • 第2引数には、例外が起きるはずの処理を書く
  • 戻り値として例外オブジェクトを受け取ると、メッセージも確認できる
  • 正常系は assertEquals、異常系は assertThrows と分けて考えると整理しやすい

関連する記事

シェアする