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別に処理を振り分ける必要があります。