Javaの単体テストとは?メソッド単位・クラス単位で何を確認するのか

本記事は、Schooの「Java入門 中級【2026年版】」第3回「単体テストによるビジネスロジック検証」を学ぶ前後に、単体テストの考え方を整理したい方向けの記事です。
単体テストという言葉を聞くと、「メソッド単位なのか」「クラス単位なのか」「mainで動かして確認するのと何が違うのか」と迷いやすいです。この記事では、JUnitの細かい書き方に入る前に、単体テストで何を確認するのかを整理します。
Schoo コースページ:Java入門 中級【2026年版】
単体テストは小さな部品の動きを確認するテスト
単体テストは、アプリケーション全体をまとめて確認するのではなく、小さな部品の動きを確認するテストです。Javaの場合は、主にクラスやメソッドの振る舞いを確認します。
初学者の段階では、まず「1つのメソッドに入力を渡し、期待した結果が返るかを確認する」と考えると理解しやすいです。
メソッド単位なのか、クラス単位なのか
結論から言うと、単体テストは「メソッドを呼び出して確認する」ことが多いですが、意味としては「そのメソッドを持つクラスの振る舞いを確認している」と考えます。
たとえば ShippingFeeCalculator クラスに calculateFee() メソッドがあるとします。
ShippingFeeCalculator calculator = new ShippingFeeCalculator();
int actual = calculator.calculateFee(3000);
assertEquals(500, actual);
テストコードでは calculateFee(3000) というメソッドを呼び出しています。ただし、確認しているのは「ShippingFeeCalculator クラスは、3000円の送料を500円と判定できるか」という振る舞いです。
そのため、「実行する単位はメソッド」「確認している意味はクラスの振る舞い」と分けて考えると混乱しにくくなります。
mainで確認するのと何が違うのか
main メソッドで実行して、表示された結果を人が目で確認することもできます。ただし、この方法では、毎回人が結果を見て判断する必要があります。
単体テストでは、「この入力なら、この結果になるはず」という期待値をテストコードに書きます。実際の結果と期待値が一致するかを、JUnitが自動で確認します。
assertEquals(500, actual) は「期待値500」と「実際の結果」を比較する確認です。どこまで含めると単体テストなのか
単体テストでは、できるだけ確認範囲を小さくします。たとえば「購入金額から送料を返す」「点数から評価を返す」「会員ランクから割引率を返す」のような処理は、単体テストで確認しやすい題材です。
一方で、画面を操作する、データベースに接続する、外部サービスと通信する、といった要素まで含めると、単体テストというより結合テストやシステムテストに近づきます。
単体テストで確認しやすい処理
単体テストで確認しやすいのは、入力と結果の関係がはっきりしている処理です。
- 購入金額が3000円なら送料500円
- 購入金額が5000円なら送料0円
- 点数が90点なら評価A
- 会員ランクがGOLDなら割引率20%
- 不正な値なら例外を通知する
このような処理は、ビジネスロジックと呼ばれることがあります。画面の見た目ではなく、業務上のルールや判定を表す処理です。
正常系・境界値・異常系を考える
単体テストでは、うまくいくケースだけではなく、境界値や不正な値も確認します。
// 3000円なら送料500円
assertEquals(500, calculator.calculateFee(3000));
// 5000円なら送料無料
assertEquals(0, calculator.calculateFee(5000));
// -1円なら例外
assertThrows(IllegalArgumentException.class, () -> calculator.calculateFee(-1));
特に 5000円以上なら送料無料 のような条件では、4999、5000、5001 のように境界の近くを確認すると、条件式の間違いに気づきやすくなります。
確認問題
次の確認内容は、単体テストとして考えやすいでしょうか。単体テストとして考えやすいものを選んでください。
calculateFee(3000)が500を返すか- ボタンをクリックしたら画面に結果が表示されるか
- DBに接続してデータが登録されるか
judgeRank(5000)がSILVERを返すかcalculateFee(-1)でIllegalArgumentExceptionが通知されるか
演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。
まとめ
- 単体テストは、小さな部品の動きを確認するテスト
- Javaではメソッドを呼び出して、クラスの振る舞いを確認することが多い
mainで目視確認するのではなく、期待値と実際の結果をコードで比較する- 画面やDBまで含めると、単体テストよりも結合テストに近づく
- 正常系・境界値・異常系を分けて考えると、テストすべき内容を整理しやすい