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

最終更新日

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

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

単体テストという言葉を聞くと、「メソッド単位なのか」「クラス単位なのか」「mainで動かして確認するのと何が違うのか」と迷いやすいです。この記事では、JUnitの細かい書き方に入る前に、単体テストで何を確認するのかを整理します。

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

単体テストは小さな部品の動きを確認するテスト

単体テストは、アプリケーション全体をまとめて確認するのではなく、小さな部品の動きを確認するテストです。Javaの場合は、主にクラスやメソッドの振る舞いを確認します。

初学者の段階では、まず「1つのメソッドに入力を渡し、期待した結果が返るかを確認する」と考えると理解しやすいです。

図解:単体テストで見る範囲
アプリ全体
画面・DB・通信なども含む
クラス
例:ShippingFeeCalculator
メソッド
calculateFee(3000)
入力と結果を確認しやすい
単体テストでは、アプリ全体ではなく、主にクラスやメソッドの小さな振る舞いを確認します。

メソッド単位なのか、クラス単位なのか

結論から言うと、単体テストは「メソッドを呼び出して確認する」ことが多いですが、意味としては「そのメソッドを持つクラスの振る舞いを確認している」と考えます。

たとえば ShippingFeeCalculator クラスに calculateFee() メソッドがあるとします。

ShippingFeeCalculator calculator = new ShippingFeeCalculator();

int actual = calculator.calculateFee(3000);

assertEquals(500, actual);

テストコードでは calculateFee(3000) というメソッドを呼び出しています。ただし、確認しているのは「ShippingFeeCalculator クラスは、3000円の送料を500円と判定できるか」という振る舞いです。

そのため、「実行する単位はメソッド」「確認している意味はクラスの振る舞い」と分けて考えると混乱しにくくなります。

mainで確認するのと何が違うのか

main メソッドで実行して、表示された結果を人が目で確認することもできます。ただし、この方法では、毎回人が結果を見て判断する必要があります。

単体テストでは、「この入力なら、この結果になるはず」という期待値をテストコードに書きます。実際の結果と期待値が一致するかを、JUnitが自動で確認します。

図解:テストコードは期待値と実際の結果を比べる
入力
3000
テスト対象
calculateFee(3000)
実際の結果
500
期待値
500
assertEquals(500, actual) は「期待値500」と「実際の結果」を比較する確認です。

どこまで含めると単体テストなのか

単体テストでは、できるだけ確認範囲を小さくします。たとえば「購入金額から送料を返す」「点数から評価を返す」「会員ランクから割引率を返す」のような処理は、単体テストで確認しやすい題材です。

一方で、画面を操作する、データベースに接続する、外部サービスと通信する、といった要素まで含めると、単体テストというより結合テストやシステムテストに近づきます。

図解:画面やDBまで含めると単体テストから広がる
単体テストとして考えやすい
1つのメソッドを呼び出し、戻り値や例外を確認する
calculateFee(5000)
連携の確認に近い
複数のクラスを組み合わせて、流れ全体を確認する
service.checkout(cart)
単体テストからは離れる
画面操作やDB接続まで含めて確認する
画面 → DB → 結果表示
単体テストは小さな範囲を見る確認です。画面やDBまで含めると、結合テストやシステムテストに近づきます。

単体テストで確認しやすい処理

単体テストで確認しやすいのは、入力と結果の関係がはっきりしている処理です。

  • 購入金額が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円以上なら送料無料 のような条件では、499950005001 のように境界の近くを確認すると、条件式の間違いに気づきやすくなります。

確認問題

次の確認内容は、単体テストとして考えやすいでしょうか。単体テストとして考えやすいものを選んでください。

  1. calculateFee(3000)500 を返すか
  2. ボタンをクリックしたら画面に結果が表示されるか
  3. DBに接続してデータが登録されるか
  4. judgeRank(5000)SILVER を返すか
  5. calculateFee(-1)IllegalArgumentException が通知されるか

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

まとめ

  • 単体テストは、小さな部品の動きを確認するテスト
  • Javaではメソッドを呼び出して、クラスの振る舞いを確認することが多い
  • main で目視確認するのではなく、期待値と実際の結果をコードで比較する
  • 画面やDBまで含めると、単体テストよりも結合テストに近づく
  • 正常系・境界値・異常系を分けて考えると、テストすべき内容を整理しやすい

関連する記事

シェアする