☕
Spring BootからMyBatisを使ったDB接続(3回目【補足】 テストメソッドにおけるMySQLシーケンスの初期化)
Spring BootでのテストにおけるAUTO_INCREMENT項目の問題点
Spring Bootでテストを行う際、MySQLのAUTO_INCREMENT属性を使ってPK値を採番すると、テストメソッド毎に都度シーケンスが初期化されるわけではありません。
テストメソッドが二つあるとすると、以下なイメージです。
テストメソッド1 2件登録(PK=1, 2を採番)
テストメソッド2 3件登録(PK=3, 4, 5 を採番)
テストメソッドの実行順序は保証されないため、順序が入れ替わると、
テストメソッド2 3件登録(PK=1, 2, 3 を採番)
テストメソッド1 2件登録(PK=4, 5を採番)
となります。
これだと、メソッドの順序によってテーブルに登録される値が変わってくるため、データの検証ができません。
そこでテストメソッド開始時にシーケンスを初期化する手順を紹介します。
ただ、このやり方がスマートなのか分からないため、他に良い方法があれば、コメント頂けると幸いです。
テストメソッド開始時にシーケンスを初期化する方法
シーケンス初期化SQLの作成
以下の場所にシーケンスを初期化するSQLを作成します。
src/test/resources/init-sequence.sql
テーブルがitem
の場合は以下の通りとなります。
init-sequence.sql
ALTER TABLE item AUTO_INCREMENT = 1;
テストメソッドの前にSQLを実行
Spring Testのリファレンスに記載されている@Sql
アノテーションを使用します。
テストメソッドに以下のように記述します。
@SpringBootTest
class SpringBootDemoApplicationTests {
@Test
@Sql("/init-sequence.sql")
void test() {
...
}
これで各テストメソッドの条件を揃えることができ、テスト順序によらず、PK値として毎回同じ値が採番されます。
Discussion