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)
);

// 省略

参考