総合サンプルコード:入力チェック+外部API呼び出し+レスポンス返却
ここまでの「早期リターン」「例外処理」「テスト設計」のベストプラクティスを組み合わせた、実務でよくある APIリクエスト処理 の例をまとめます。
サンプルコード
public class UserController {
public Response getUserProfile(Request req, ExternalApi api) {
// --- 早期リターンで入力チェック(想定内の異常) ---
if (req == null) {
return new Response(400, "リクエストが空です");
}
if (req.getUserId() == null || req.getUserId().isEmpty()) {
return new Response(400, "ユーザーIDが必要です");
}
// --- 例外処理で外部要因をカバー(想定外の異常) ---
try {
UserProfile profile = api.fetchProfile(req.getUserId());
if (profile == null) {
return new Response(404, "ユーザーが見つかりません");
}
return new Response(200, "成功", profile);
} catch (IOException e) {
return new Response(503, "外部サービスエラー: " + e.getMessage());
} catch (Exception e) {
return new Response(500, "予期せぬエラー: " + e.getMessage());
}
}
}
Javaテスト設計の観点
- 入力チェックテスト
req = null→ 400エラーuserId = ""→ 400エラー
- 正常系テスト
- 正しい
userId→ 200成功+プロフィール返却
- 正しい
- 外部要因テスト
- APIモックで
IOExceptionを投げる → 503エラー - APIモックで予期せぬ例外を投げる → 500エラー
- APIモックで
👉 早期リターンで「業務ロジックの異常系」が明確、例外処理で「外部要因の異常系」が分離されているので、テストケースを整理しやすい。
まとめ
- 早期リターン: 入力チェックや業務ロジックの条件不一致を即終了。
- 例外処理: 外部APIやシステム的な失敗を安全にキャッチ。
- テスト設計: 異常系と正常系を分けて考えることで、ユニットテストが明確になる。
✅ このように「早期リターン+例外処理+テスト設計」を組み合わせると、読みやすく・安全で・テストしやすいコードが書けます。
