Java | 早期リターン(ガード節)のメリットと注意点

Java Java
スポンサーリンク

クリーンアーキテクチャを強化するテスト戦略

早期リターン・例外処理・レイヤード設計を組み合わせたコードは、テスト設計を意識するとさらに強力になります。ここでは ユニットテスト・統合テスト・エンドツーエンドテスト(E2E) の役割分担を整理します。


テスト戦略の3層構造

1. ユニットテスト(Unit Test)

  • 対象: ユースケース層やドメインロジック(ビジネスルール)
  • 目的: 業務ロジックが正しく動くかを確認
  • 特徴: 外部依存(DBやAPI)はモック化してテスト
  • 例:
    • GetUserProfileUseCase.execute("validId") → 正しいプロフィールを返す
    • GetUserProfileUseCase.execute("invalidId")UserNotFoundException を投げる

👉 早期リターンは「条件不一致のテストケース」を簡単に書ける。
👉 例外処理は「異常系をモックで再現」できる。


2. 統合テスト(Integration Test)

  • 対象: コントローラ層+サービス層(アプリケーション内部の結合)
  • 目的: 入力チェック・レスポンス生成・例外ハンドリングが正しく動くか確認
  • 特徴: 外部依存はモック化するが、層のつながりは実際に動かす
  • 例:
    • req = null → 400レスポンス
    • req.userId = "" → 400レスポンス
    • サービス層が null を返す → 404レスポンス
    • サービス層が例外を投げる → 503 or 500レスポンス

👉 早期リターンで「入力チェックの異常系」が明確。
👉 例外処理で「外部要因の異常系」がレスポンスに変換されることを確認。


3. エンドツーエンドテスト(E2E Test)

  • 対象: システム全体(UI → コントローラ → サービス → インフラ)
  • 目的: 実際のユーザー操作や外部APIとのやり取りを含めて動作確認
  • 特徴: モックを使わず、実際の環境でテスト
  • 例:
    • 正しいユーザーIDを入力 → 実際の外部APIからプロフィール取得 → 200レスポンス
    • 存在しないユーザーID → 404レスポンス
    • 外部APIがダウン → 503レスポンス

👉 例外処理が「現実の障害」を正しくレスポンスに変換できるかを確認。


まとめ

  • ユニットテスト: 業務ロジックをモックで検証(早期リターン・例外発生を確認)。
  • 統合テスト: コントローラ+サービスの結合を確認(レスポンス生成の正しさ)。
  • E2Eテスト: 実際の環境で全体の動作を確認(外部要因の例外処理を含む)。

✅ この3層のテスト戦略を組み合わせることで、読みやすく・安全で・テストしやすい設計がさらに強化されます。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました