S2Unit DB更新後の検証用Assertクラス

S2Daoを試しながらS2Unitでテストしているときに気づいたことがある。
それはDBを更新するDaoのメソッドをテストする場合、検証の部分はいつもこんなパターンのコードになるということ。

DataSet actualDataSet = new DataSetImpl();
actualDataSet.addTable(readDbByTable("TABLE_NAME"));
DataSet expectedDataSet = readXls("testUpdate_result.xls");
assertEquals(expectedDataSet, actualDataSet);

ここではExcelで用意したデータとDBのデータが等しいことを検証しているので、

assertDbEquals(readXls("testUpdate_result.xls"));

こんなふうに書けたらいいなぁと思った。引数のDataSetにあるテーブルだけをDBへ見に行けばいいわけだし。
早速実装してみよう。まずはAssert用のクラス。

import javax.sql.DataSource;
import junit.framework.Assert;
import org.seasar.extension.dataset.DataSet;
import org.seasar.extension.dataset.impl.DataSetImpl;
import org.seasar.extension.dataset.impl.SqlTableReader;

public class DbAssert {
    private DbAssert() {
    }

    public static void assertDbEquals(String message, DataSet expectedDataSet, DataSource dataSource) {
        Assert.assertNotNull(expectedDataSet);
        Assert.assertNotNull(dataSource);

        SqlTableReader reader = new SqlTableReader(dataSource);
        DataSet actualDb = new DataSetImpl();
        for (int i = 0; i < expectedDataSet.getTableSize(); i++) {
            String tableName = expectedDataSet.getTable(i).getTableName();
            reader.setTable(tableName, null);
            actualDb.addTable(reader.read());
        }
        Assert.assertEquals(message, expectedDataSet, actualDb);
    }

    public static void assertDbEquals(DataSet expectedDataSet, DataSource dataSource) {
        assertDbEquals(null, expectedDataSet, dataSource);
    }
}

S2Unitと一緒に使うことが前提なので、かなり簡単に実装できた。
でもDBにアクセスしなければならないのでDataSourceが必要になってしまったなぁ。このままだとちょっと使いにくいけど、S2TestCaseを継承してれば

DBAssert.assertDbEquals(readXls("testUpdate_result.xls"), getDataSource());

こうできるから問題ないかな。