DbUnitの期待値ってレコードが空のテーブルはカラム情報も読み込まないのね

ということを今さらながら知りました。


なるほど,

Assertion.assertEquals(expectTable,
                       new CompositeTable(expectTable.getTableMetaData(), actualTable));

とやって,actualの評価を緩やかにしていたから気付かなかったのね。
#actualTableをCompositeTableにくるむと,expectTableにあるカラムだけ評価される。
#CompositeTableにくるまないと,expectとactualは完全一致しないとダメ。


こりゃ参ったな。と思ったけど「実は空テーブルです」的なマークを期待値に埋め込むようにして,独自assertionメソッド作りゃ解決だよねってことで,こんな風にした。

スペック
データ行の1行目のカラム(どこでもいい)に"***EMPTY***"ってあれば,そのテーブルは空って意味とする。

DbUnit - Assertion.assertEquals()の"Verify row count"の直前にこんなコード埋めておしまい。

if (expectedTable.getRowCount() > 0) {
for (int i = 0; i < expectedColumns.length; i++) {
  Column expectedColumn = expectedColumns[i];
  String columnName = expectedColumn.getColumnName();
  Object expectedValue = expectedTable.getValue(0, columnName);
  if (expectedValue.toString().equlas("***EMPTY***")) {
    // 空テーブルなので,ここまで評価すれば十分
    return;
  }
}

相変わらず,雑なパッチだ。:-D