testcontainers-java で MySQL の複数のデータベースを構成する

趣旨

永続化層のための自動テストを testcontainers で用意する話。

前置き

やったこと

  • テストリソースディレクトリに DDL を配置
    • データベース
    • ユーザー
    • テーブル・ビュー
  • GenericContainer を生成する static メソッドを定義
  • テスト用のアプリケーションコンテキスト設定クラスを作成
    • データソースを定義
      • データベース数ごとに定義
      • データベースの接続情報は GenericContainer.getContainerIpAddressGenericContainer.getMappedPort で取得
      • アプリケーションコンテキストより先に GenericContainer が開始するよう JUnit Rule で制御している
    • エンティティマネージャーファクトリーを定義
      • データソースごとに定義
    • トランザクションマネージャーを定義
      • エンティティマネージャーファクトリーごとに定義
    • @ComponentScan を定義
  • テストクラスを作成
    • @ContextConfiguration(classes=) にテスト用のアプリケーションコンテキスト設定クラスを指定
    • ClassRule(order=0) で修飾したクラスフィールドへ GenericContainerインスタンスを束縛
      • orderJUnit 4.13-rc2 で追加される機能
      • JUnit 4.12 では指定できないので @BeforeClass@AfterClass を利用するとよい
    • ClassRule(order=1) で修飾したクラスフィールドへ SpringClassRuleインスタンスを束縛
    • Rule で修飾したインスタンスフィールドへ SpringMethodRuleインスタンスを束縛
    • (必要なら) テストクラスやテストメソッドを @Sql で修飾してテーブルの内容を準備
      • クラスパスに配置した DML を実行できる

詳細

こんな感じ。

bitbucket.org

参考リンク

www.testcontainers.org

mike-neck.hatenadiary.com