(solved) ComparisonFailure / expected: but was:

(この記事のアクセスが多いようなので別の記事の宣伝を貼ってみます)

RubyでオレオレVMアセンブラとコード生成器を2週間で作ってライフゲームを動かした話 - memo88
https://memo88.hatenablog.com/entry/2019/05/04/232236



  • DBのテーブルのカラムの値が空文字列
  • 期待値テーブル(xls)の対応するセルが空のセル

の場合、空のセルが null として扱われてしまい、assert が失敗する。

    @Test
    public void testEmptyString() throws DatabaseUnitException, SQLException, IOException, ClassNotFoundException{
        
        Connection con = null;
        con = getMyConnection();
        IDatabaseConnection dbcon = new DatabaseConnection(con);

        // 初期データをロード
        IDataSet dataset = new XlsDataSet(new File(testDataDir + "/empty_string.xls"));
        DatabaseOperation.CLEAN_INSERT.execute(dbcon, dataset);

        // "NAME" 列を空文字列に更新
        // UPDATE MEMBERS SET NAME='' WHERE ID=1
        (new MembersExcel()).updateEmptyString();
        
        // 期待値データをロード
        IDataSet expectedDataSet = new XlsDataSet(new File(testDataDir + "/empty_string-expected.xls"));
        ITable expectedTable = expectedDataSet.getTable("MEMBERS");

        // DBのテーブルからデータを取得
        IDataSet actualDataSet = dbcon.createDataSet();
        ITable actualTable = actualDataSet.getTable("MEMBERS");

        // 期待値と実際の値を比較
        Assertion.assertEquals(expectedTable, actualTable);
        //=> junit.framework.ComparisonFailure: value (table=MEMBERS, row=0, col=NAME) expected:<[null]> but was:<[]>
    }

こういう場合も ReplacementDataSet を使えばいいみたい。xlsの側では空文字列として扱いたいセルに "[EMPTY_STRING]" と書いておく。

IDataSet expectedDataSet = new XlsDataSet(new File(testDataDir + "/empty_string-expected.xls"));
ReplacementDataSet expectedDataSetReplacement = new ReplacementDataSet(expectedDataSet);
expectedDataSetReplacement.addReplacementObject("[EMPTY_STRING]", "");
ITable expectedTableReplacement = expectedDataSetReplacement.getTable("MEMBERS");

// ...

Assertion.assertEquals(expectedTableReplacement, actualTable);

環境

メモ

ReplacementDataSet は IDataSet を implement しているので IDataSet.getTable() が呼べる。