spring-boot-testing について
spring-boot-testing は、Spring Boot 4 アプリケーションの開発者向けテストガイドです。テスト範囲とツールの選択に加え、アサーション、Testcontainers、テストデータ、性能、移行の資料をまとめています。
主な機能
- 01テストスライスの選択ガイド
- 02MockMvcTester と RestTestClient の資料
- 03AssertJ アサーションのガイド
- 04Testcontainers によるデータベーステスト
- 05カバレッジとコンテキストキャッシュの助言
活用シーン
- 01コントローラーに適したテストを選択
- 02データベースに対して JPA クエリをテスト
- 03REST クライアントと JSON シリアライズをテスト
- 04Spring Boot 4 のテスト移行を計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ marcelorodrigo/ agent-skills --skill spring-boot-testingインストール後、Claude Code で/spring-boot-testingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/assertj-basics.mdassertj-collections.mdcontext-caching.mddatajpatest.mdinstancio.mdmockitobean.mdmockmvc-classic.mdmockmvc-tester.mdrestclienttest.mdresttestclient.mdsb4-migration.mdtest-slices-overview.mdtestcontainers-jdbc.mdwebmvctest.md詳細
Spring Boot Testing
最新のパターンとベストプラクティスを用いて Spring Boot 4 アプリケーションをテストするための専門ガイドです。
基本原則
- テストピラミッド:ユニット(高速)>スライス(対象を絞る)>統合(完全)
- 適切なツール:信頼性を確保できる範囲で、最も対象を絞ったスライスを使用します
- AssertJ スタイル:冗長なマッチャーより、流れるように読みやすいアサーションを使用します
- 最新の API:レガシーな代替手段より、MockMvcTester と RestTestClient を優先します
どのテストスライスを使うか?
| シナリオ | アノテーション | 参照 |
|---|---|---|
| コントローラー + HTTP のセマンティクス | @WebMvcTest | references/webmvctest.md |
| リポジトリ + JPA クエリ | @DataJpaTest | references/datajpatest.md |
| REST クライアント + 外部 API | @RestClientTest | references/restclienttest.md |
| JSON の(デ)シリアライズ | @JsonTest | references/test-slices-overview.md を参照 |
| アプリケーション全体 | @SpringBootTest | references/test-slices-overview.md を参照 |
テストスライスのリファレンス
- references/test-slices-overview.md - 判断マトリックスと比較
- references/webmvctest.md - MockMvc を使った Web 層
- references/datajpatest.md - Testcontainers を使ったデータ層
- references/restclienttest.md - REST クライアントのテスト
テストツールのリファレンス
- references/mockmvc-tester.md - AssertJ スタイルの MockMvc(3.2+)
- references/mockmvc-classic.md - 従来の MockMvc(3.2 より前)
- references/resttestclient.md - Spring Boot 4+ の REST クライアント
- references/mockitobean.md - 依存関係のモック化
アサーションライブラリ
- references/assertj-basics.md - スカラー値、文字列、真偽値、日付
- references/assertj-collections.md - リスト、セット、マップ、配列
Testcontainers
- references/testcontainers-jdbc.md - PostgreSQL、MySQL など
テストデータの生成
- references/instancio.md - 複雑なテストオブジェクトを生成します(3 つ以上のプロパティ)
パフォーマンスと移行
- references/context-caching.md - テストスイートを高速化します
- references/sb4-migration.md - Spring Boot 4.0 の変更点
クイック判断ツリー
Testing a controller endpoint?
Yes → @WebMvcTest with MockMvcTester
Testing repository queries?
Yes → @DataJpaTest with Testcontainers (real DB)
Testing business logic in service?
Yes → Plain JUnit + Mockito (no Spring context)
Testing external API client?
Yes → @RestClientTest with MockRestServiceServer
Testing JSON mapping?
Yes → @JsonTest
Need full integration test?
Yes → @SpringBootTest with minimal context config
Spring Boot 4 の主な特徴
- RestTestClient:TestRestTemplate の最新の代替手段
- @MockitoBean:@MockBean(非推奨)を置き換えます
- MockMvcTester:Web テスト用の AssertJ スタイルのアサーション
- モジュール化されたスターター:テクノロジーごとのテストスターター
- コンテキストの一時停止:キャッシュされたコンテキストを自動的に一時停止します(Spring Framework 7)
テストのベストプラクティス
コードの複雑さの評価
メソッドやクラスが複雑すぎて効果的にテストできない場合は、次のようにします。
- 複雑さを分析する - 1 つのメソッドを網羅するのに 5~7 件を超えるテストケースが必要な場合、複雑すぎる可能性があります
- リファクタリングを提案する - コードをより小さく、目的を絞った関数に分割することを提案します
- ユーザーが判断する - ユーザーがリファクタリングに同意したら、抽出箇所の特定を支援します
- 必要であれば続行する - ユーザーが複雑なコードのまま進めると判断した場合は、難しくてもテストを実装します
リファクタリングの提案例:
// Before: Complex method hard to test
public Order processOrder(OrderRequest request) {
// Validation, discount calculation, payment, inventory, notification...
// 50+ lines of mixed concerns
}
// After: Refactored into testable units
public Order processOrder(OrderRequest request) {
validateOrder(request);
var order = createOrder(request);
applyDiscount(order);
processPayment(order);
updateInventory(order);
sendNotification(order);
return order;
}
コードの重複を避ける
よく使うオブジェクトやモックのセットアップにはヘルパーメソッドを作成し、可読性と保守性を高めます。
@DisplayName を使ったテストの整理
テストの意図を明確にするため、説明的な表示名を使用します。
@Test
@DisplayName("Should calculate discount for VIP customer")
void shouldCalculateDiscountForVip() { }
@Test
@DisplayName("Should reject order when customer has insufficient credit")
void shouldRejectOrderForInsufficientCredit() { }
テストカバレッジの順序
テストは必ず次の順序で構成します。
- 主要なシナリオ - 正常系で、最も一般的なユースケース
- その他のパス - 有効な代替シナリオ、エッジケース
- 例外/エラー - 無効な入力、エラー条件、失敗時の動作
本番環境のシナリオをテストする
実際の本番環境のシナリオを念頭に置いてテストを作成します。これにより、テストがより身近になり、実際の本番環境におけるコードの動作を理解しやすくなります。
テストカバレッジの目標
品質と労力の実用的なバランスとして、コードカバレッジ80%を目指します。カバレッジをさらに高めることは有益ですが、それだけが目標ではありません。
カバレッジのレポート作成と追跡には、Jacoco maven pluginを使用します。
カバレッジのルール:
- カバレッジは最低80%
- 単にコードを実行するだけでなく、意味のあるアサーションを重視
優先すべき項目:
- ビジネス上重要な処理(決済処理、注文の検証)
- 複雑なアルゴリズム(価格設定、割引計算)
- エラー処理(例外、エッジケース)
- 統合ポイント(外部API、データベース)
依存関係(Spring Boot 4)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-testcontainers</artifactId>
<scope>test</scope>
</dependency>
コメント
Markdown 対応