Mavenでビルドした時に発生したエラー③初期データ投入時の一意制約違反
Mavenから実行したJUnitでのテスト実行時、大量に発生した一意制約違反のエラーの解決方法について。
環境
- Spring Boot: 2.3.3.RELEASE
- STS4: 4.3.2.RELEASE
- Maven: 3.6.1
- H2 Database Engine: 1.4.200
エラー内容
maven package
によりMavenから実行したJUnitでのテスト実行時、一意制約違反のエラーが大量に発生しました。
調べてみると、@SpringBootTest
を使用しているクラスで、Spring Bootを起動してスキーマ定義と初期データを投入する必要のあるテストケースで発生していることが分かりました。
各テストメソッド実行時にデータベース(H2Database)の初期化がうまくいっていないことで、一意制約違反エラーが発生しているようでした。
解決方法
データベースのスキーマ定義ファイルschema.sqlで、最初にDROP ALL OBJECTS
で既存データを全て削除するようにします。
詳しいことはよくわかりませんでしたが参考ページによると、各テスト後にH2DBがリセットされないことが原因で、Spring側のバグではなくH2DBがアップデートでバグ対応したことに関係しているようです。
例
application.propertiesでspring.datasource.schema
に指定したスキーマ定義ファイルに、以下のように記載します。
DROP ALL OBJECTS;
/* ユーザマスタ */
CREATE TABLE IF NOT EXISTS m_user (
name VARCHAR(50) PRIMARY KEY,
password VARCHAR(255),
authority VARCHAR(20)
);
// 省略