mcpField
S
spring-jpa-testing

spring-jpa-testing

github.com/spring-ai-communityテスト・品質5243 回インストール27 週間前に更新
リポジトリ

spring-jpa-testing について

`@DataJpaTest`を使うJPAリポジトリテスト向けのSpringスキルです。実データを用いたセットアップと、読み取り検証前のフラッシュおよび永続化コンテキストのクリアを重視します。

主な機能

  1. 01`@DataJpaTest`のセットアップパターン
  2. 02TestEntityManagerによるデータ設定
  3. 03読み取り前のフラッシュとクリア
  4. 04Testcontainers設定のガイダンス
  5. 05トランザクションテストの問題調査
  6. 06Hibernate移行のガイダンス

活用シーン

  1. 01リポジトリクエリとページネーションのテスト
  2. 02データベース制約と一括更新の検証
  3. 03遅延ロードやトランザクションテストの問題調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/spring-ai-community/spring-testing-skills --skill spring-jpa-testing

インストール後、Claude Code で/spring-jpa-testingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
hibernate-6-migration.md
lazy-loading-tests.md
testcontainers.md
transactional-tests.md

詳細

Spring JPA テスト

重要:@DataJpaTestでは、テストデータのセットアップにTestEntityManagerが必要です。また、読み取りアサーションの前にflush()とclear()を呼び出す必要があります。これを省略したテストでは、Hibernate の L1 キャッシュから読み取って誤ってテストが成功するため、データベースに対してクエリが実行されません。詳しくは、以下の「重要なルール」を参照してください。

関連項目:@DataJpaTest、JpaRepository、EntityManager、TestEntityManager、@ServiceConnection、PostgreSQLContainer、@AutoConfigureTestDatabase、@Modifying、clearAutomatically、Testcontainers、Hibernate 6、Hibernate 7

テスト済み環境

  • Spring Boot 3.2+/Spring Boot 4.x
  • Spring Framework 6.x/Spring Framework 7.x
  • Hibernate 6.x/Hibernate 7.x
  • JUnit 5、Testcontainers 1.19+

重要なルール — @DataJpaTestでは必ず適用

1. テストデータのセットアップにはTestEntityManagerを使用し、Mockitoのモックは使用しないでください。 @DataJpaTestは実際のインメモリデータベースを提供します。リポジトリをモックすると、その目的が損なわれます。 @Autowired TestEntityManager emを使用し、em.persist()/em.persistAndFlush()でテストデータを挿入してください。 セットアップにテスト対象のリポジトリを使用しないでください。リポジトリのバグによってセットアップとアサーションの両方の失敗が隠される、循環したロジックになってしまいます。

2. 読み取りアサーションの前に、必ずflush()とclear()を呼び出してください。 テストデータを永続化した後、リポジトリを通じてクエリを実行する前に、em.flush()、続けてem.clear()を呼び出してください。 flushしないと、SQLがデータベースに送信されない場合があります。clearしないと、リポジトリはHibernateのL1キャッシュからエンティティを返すため、クエリが実際にはデータベースに対して実行されません。

@DataJpaTest
class OrderRepositoryTest {
    @Autowired TestEntityManager em;
    @Autowired OrderRepository orders;

    @Test
    void findByStatus_returnsMatching() {
        em.persist(new Order("pending"));
        em.persist(new Order("shipped"));
        em.flush();   // SQL hits the database
        em.clear();   // L1 cache evicted — forces real DB read

        List<Order> result = orders.findByStatus("pending");
        assertThat(result).hasSize(1);
    }
}

@Modifyingによる一括更新、制約違反のテスト、@Transactionalの落とし穴など、詳細なパターンについてはreferences/transactional-tests.mdを参照してください。

このスキルを使用しない場合

  • RESTコントローラーやHTTPエンドポイントのテスト → spring-mvc-testingを使用してください
  • 認証、認可、CSRF、JWT、OAuth2のテスト → spring-security-testingを使用してください
  • リアクティブリポジトリ(R2DBC)やWebClientのテスト → spring-webflux-testingを使用してください
  • Springコンテキストを使用しない純粋なユニットテストの作成 → spring-testing-fundamentalsを使用してください
  • AssertJアサーションやMockitoスタブの設定 → spring-testing-fundamentalsを使用してください

リファレンスを読むタイミング

状況参照先
Testcontainersと@ServiceConnectionを使った@DataJpaTestのセットアップreferences/testcontainers.md
@DataJpaTestと@SpringBootTestのどちらを使うか選ぶreferences/testcontainers.md
@Transactionalのロールバック問題、flush/clearの問題、テストの分離をデバッグするreferences/transactional-tests.md
テストパターンの作成:派生クエリ、@Query、ページネーション、仕様、プロジェクション、監査references/transactional-tests.md
テストでは遅延読み込みが機能するのに本番環境では失敗する、N+1問題references/lazy-loading-tests.md
SINGLE_TABLE継承、読み取り専用リポジトリ、@QueryHintの落とし穴のテストreferences/lazy-loading-tests.md
Hibernate 6.xまたは7.xへの移行時の失敗、Jakartaパッケージ、シーケンス名、ClassCastExceptionreferences/hibernate-6-migration.md
Boot 3.xから4.xへの移行に伴うテストパッケージのインポート変更references/hibernate-6-migration.md

コメント