Javaでテストケースを作るには?正常系・境界値・異常系をJUnitで確認する方法

最終更新日

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

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

JUnitの書き方を覚えても、「どの値をテストすればいいのか」が決まっていないと、意味のある単体テストにはなりにくいです。この記事では、日本語の仕様からテストケースを作り、JUnitコードに落とし込む流れを整理します。

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

テストケースは入力と期待する結果のセット

テストケースとは、「何を入力して、どの結果になることを確認するか」を決めたものです。単体テストでは、メソッドに渡す値と、期待する戻り値や例外を先に整理します。

たとえば送料計算なら、「3000円を渡したら送料500円」「5000円を渡したら送料0円」のように、入力値と期待する結果を組み合わせて考えます。

図解:仕様からテストケースを作り、JUnitコードにする
日本語の仕様
5000円以上なら送料無料。5000円未満なら送料500円。0円未満はエラー。
テストケース表
入力値、期待する結果、確認方法を整理する
JUnitコード
assertEquals(…)
assertThrows(…)
いきなりJUnitを書くのではなく、まず仕様をテストケース表に整理すると、何を確認するべきかが見えやすくなります。

まず日本語の仕様を読む

いきなりJUnitのコードを書き始めるのではなく、まず日本語の仕様を確認します。

購入金額が5000円以上なら送料は0円。5000円未満なら送料は500円。購入金額が0円未満の場合はエラーとする。

この仕様から、正常に処理される値、条件が切り替わる値、不正な値を分けて考えます。

図解:正常系・境界値・異常系に分けて考える
正常系
普通に使ったときに、期待どおりの結果になるか
calculateFee(3000)
境界値
条件が切り替わる直前・ちょうど・直後を見る
4999 / 5000 / 5001
異常系
不正な値を渡したとき、例外で止められるか
calculateFee(-1)
テストケースは、正常に動く値だけでなく、境界の値と不正な値も含めて考えます。

正常系を決める

正常系は、普通に使ったときに期待どおり動くかを確認するテストケースです。送料計算なら、5000円未満の代表値として 3000、5000円以上の代表値として 10000 などを選べます。

assertEquals(500, calculator.calculateFee(3000));
assertEquals(0, calculator.calculateFee(10000));

正常系だけでも動作確認にはなりますが、条件式の間違いを見つけるには境界値も必要です。

境界値を決める

境界値は、条件が切り替わる境目の値です。「5000円以上なら送料無料」の場合、5000 が境界になります。

境界値では、境目の直前、ちょうど、直後を確認すると、>>= の書き間違いに気づきやすくなります。

assertEquals(500, calculator.calculateFee(4999));
assertEquals(0, calculator.calculateFee(5000));
assertEquals(0, calculator.calculateFee(5001));

異常系を決める

異常系は、不正な値を渡したときに、想定どおり処理できるかを確認するテストケースです。今回の仕様では、購入金額が0円未満の場合はエラーにします。

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

戻り値を確認する場合は assertEquals、例外を確認する場合は assertThrows を使います。

テストケース表に整理する

確認したい値が増えてきたら、先にテストケース表に整理すると、抜け漏れに気づきやすくなります。

図解:送料計算のテストケース表
種類
入力値
期待する結果
確認方法
正常系
3000
500
assertEquals
境界値
4999
500
assertEquals
境界値
5000
0
assertEquals
正常系
10000
0
assertEquals
異常系
-1
例外
assertThrows
テストケース表では、入力値と期待する結果を先に決めてから、JUnitの確認方法を選びます。

テストケース表をJUnitコードに変換する

テストケース表ができたら、戻り値を確認する行は assertEquals、例外を確認する行は assertThrows に変換します。

@Test
void testCalculateFee() {
    ShippingFeeCalculator calculator = new ShippingFeeCalculator();

    assertEquals(500, calculator.calculateFee(3000));
    assertEquals(500, calculator.calculateFee(4999));
    assertEquals(0, calculator.calculateFee(5000));
    assertEquals(0, calculator.calculateFee(5001));
    assertEquals(0, calculator.calculateFee(10000));
}

@Test
void testCalculateFeeThrowsExceptionWhenAmountIsNegative() {
    ShippingFeeCalculator calculator = new ShippingFeeCalculator();

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

1つのテストメソッドにすべて詰め込むこともできますが、慣れてきたら正常系、境界値、異常系でテストメソッドを分けると、失敗したときに原因を追いやすくなります。

確認問題

次の仕様から、テストケースを考えてください。

購入金額が10000円以上なら会員ランクはGOLD。5000円以上10000円未満ならSILVER。5000円未満ならBRONZE。購入金額が0円未満の場合は例外とする。

正常系、境界値、異常系に分けて、入力値と期待する結果を整理してください。

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

まとめ

  • テストケースは、入力値と期待する結果のセット
  • いきなりJUnitを書く前に、日本語の仕様を整理する
  • 正常系、境界値、異常系に分けるとテストすべき値を決めやすい
  • 戻り値は assertEquals、例外は assertThrows で確認する
  • テストケース表を作ると、確認漏れに気づきやすい

関連する記事

シェアする