Spring BootからMyBatisを使ったDB接続(3回目【補足】 テストメソッドにおけるMySQLシーケンスの初期化)

2022/11/13に公開

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アノテーションを使用します。

https://spring.pleiades.io/spring-framework/docs/current/reference/html/testing.html#testcontext-executing-sql-declaratively

テストメソッドに以下のように記述します。

@SpringBootTest
class SpringBootDemoApplicationTests {

    @Test
    @Sql("/init-sequence.sql")
    void test() {
        ...
    }

これで各テストメソッドの条件を揃えることができ、テスト順序によらず、PK値として毎回同じ値が採番されます。

Discussion