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使うとは思いもよらんかったなぁ。