(2011-07) (solved) ComparisonFailure / expected: but was:

<他の記事の案内です>

<案内おわり>



  • 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() が呼べる。