IDの自動生成とS2Unit
MySQLでAUTO_INCREMENTによるIDの自動生成を行っていると、S2Unitでテストを実行する時に少し困ったことが起こります。
AUTO_INCREMENTカウンタはトランザクションがロールバックされてもリセットされないので、テスト中に新規挿入されるIDの値が直前までのテーブル操作状態に依存します。このため、Excelファイルで用意した期待値データ中のIDとテスト結果のIDが一致しないケースが発生してしまいます。
これを回避するために、org.seasar.extension.unit.S2TestCase#deleteTable()を書き換えてみました。
public void deleteTable(String tableName) { UpdateHandler handler = new BasicUpdateHandler(getDataSource(), "DELETE FROM " + tableName); handler.execute(null); // 以下を追加 handler = new BasicUpdateHandler(getDataSource(), "ALTER TABLE " + tableName + " AUTO_INCREMENT = 0"); handler.execute(null); }
テストメソッドの先頭でreadXlsAllReplaceDb()を呼び出してDBを初期化する際に、カウンタも併せて初期化されるようになります。これではもちろんMySQL依存になってしまうので、実際はDBMS別に処理を振り分ける必要があります。