趣旨
永続化層のための自動テストを testcontainers
で用意する話。
前置き
- 複数の MySQL インスタンスの複数のデータベースに接続する重量級のアプリケーションがある
testcontainers-java
に含まれるMySQLContainer
はmysql
の Docker イメージを利用する前提になっているmysql
の Docker イメージは環境変数による複数データベースの構成をサポートしていない
やったこと
- テストリソースディレクトリに DDL を配置
- データベース
- ユーザー
- テーブル・ビュー
GenericContainer
を生成するstatic
メソッドを定義- テスト用のアプリケーションコンテキスト設定クラスを作成
- テストクラスを作成
@ContextConfiguration(classes=)
にテスト用のアプリケーションコンテキスト設定クラスを指定ClassRule(order=0)
で修飾したクラスフィールドへGenericContainer
のインスタンスを束縛ClassRule(order=1)
で修飾したクラスフィールドへSpringClassRule
のインスタンスを束縛Rule
で修飾したインスタンスフィールドへSpringMethodRule
のインスタンスを束縛- (必要なら) テストクラスやテストメソッドを
@Sql
で修飾してテーブルの内容を準備- クラスパスに配置した DML を実行できる
詳細
こんな感じ。