AssertionHelperクラス

AssertionHelperクラスを使えばラクにアサートすることができます。

  1. List<Dept> deptList = deptDao.listAllDept();
  2. AssertionHelper.assertEqualsOnlyColumnsInFile(
  3. deptList,
  4. getClass(),
  5. "dept.xml");
単に内部ではリストをデータセットに変換して、ファイルと比較してるだけです。

getClass()してるのは、ファイルをテストクラスと同じパッケージから探すためです。

テストクラスが「aaa.bbb.ccc.HogeTest」であれば、「aaa/bbb/ccc/dept.xml」を読み込みます。

メソッド名のとおり、ファイルに記述したカラムのみ比較します。

たとえば、BeanであるDeptクラスにこういうプロパティがあるとします。

  • dname
  • deptno
  • location
  • updateDate

updateDateは更新日付と考えましょう。

一方、XMLはこういう記述です。

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <dataset>
  3. <DEPT DEPTNO="10" DNAME="ACCOUNTING" LOCATION="NEW YORK" />
  4. <DEPT DEPTNO="20" DNAME="RESEARCH" LOCATION="DALLAS" />
  5. <DEPT DEPTNO="30" DNAME="SALES" LOCATION="CHICAGO" />
  6. <DEPT DEPTNO="40" DNAME="OPERATIONS" LOCATION="BOSTON" />
  7. </dataset>
updateDateはありません。

なので、アサートではdname,deptno,locationのみ比較します。

DbUnitのデフォルトでは、こういうカラムが異なる場合、アサートが失敗してしまいます。

自分でDefaultColumnFilter.includedColumnsTable()とかexcludedColumnsTable()とかしないといけない。

なのでAssertionHelperに組み込んでおきました。

もちろん通常のDbUnitのアサートをしたいときは、普通にDbUnitのAssertionクラスを利用すればいいわけです。

日付型

DbUnitで期待値をXMLやExcelに記述すると思うけど、 日付の書式は基本的にDate.valueOf()やTimestamp.valueOf()で有効な書式を記述する。

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <dataset>
  3. <datebean
  4. javaUtilDate="2008-08-08"
  5. javaSqlDate="2008-08-08 15:20:11"
  6. timestamp="2008-08-08 15:20:11.000" />
  7. </dataset>

試したけど、java.util.Dateでもjava.sql.Dateでも次の2つのパターンが有効。

  • yyyy-MM-dd
  • yyyy-MM-dd HH:mm:ss(.SSSSSSSSS)((ミリ秒は1〜9桁まで記述可))

null

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <dataset>
  3. <DEPT DEPTNO="10" DNAME="[null]" LOC="NEW YORK"/>
  4. </dataset>

[null]と記述すると、nullとして扱います。

AssertionHelperクラスを使ってアサートする場合です。

内部的にはReplacementDataSetを使っています。