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());
こうできるから問題ないかな。