DbUnitのAssertion.assertEquals()をホゲる

ども。今さらDbUnitなんて使ってるんだけど「期待値に正規表現でパターン指定できたら,もっと便利なのに」と思ったんで,さっそくイジってみた。


イジったのは,ここ。→DbUnit - Assertion.assertEquals()

Object expectedValue = expectedTable.getValue(i, columnName);
Object actualValue = actualTable.getValue(i, columnName);

// 143行目から150行目を こう書き換える
if (expectedValue.toString().startsWith('#')) {
  String regExp = expectedValue.toString().substring(1)
  if (!Pattern.matches(regExp, actualValue.toString())) {
    Assert.fail("value (table=" + expectedTableName + ", " +
                "row=" + i + ", col=" + columnName + "): expected:<" +
                regExp +"> but was:<" + actualValue + ">");
  }
} else {
  DataType dataType = getComparisonDataType(expectedTableName, expectedColumn, actualColumn);
  if (dataType.compare(expectedValue, actualValue) != 0)
     Assert.fail("value (table=" + expectedTableName + ", " +
                 "row=" + i + ", col=" + columnName + "): expected:<" +
                 expectedValue + "> but was:<" + actualValue + ">");
}
// <--- ここまで

エラい雑だけど,一応動いてる(NULLチェックとか甘いかも)。それと,わざわざパッチ当てなくても,DbUnitのAssertionクラスをコピって俺様Assertionクラスを作るだけでも十分。


見ての通り,期待値が '#' で始まる場合は,その後の文字列を正規表現とみなして,実測値と比較させます。
おかげさまで,日付とかシーケンス番号とか動的に値が変わる場所もパターンチェックくらいはできるようになりましたよ。


(追記)JDK正規表現ライブラリだと日本語からむと挙動がおかしかったんで,Jakarta ORO(Perl5Util)に書き換えた。
こんなところで,ORO使うとは思いもよらんかったなぁ。