将2个数据集与dbunit进行比较?

时间:2012-09-20 07:55:03

标签: testing junit dataset compare dbunit

目前我需要为我的应用程序创建测试。我使用“dbunit”来实现这一点,现在需要比较2个数据集:

1)我用QueryDataSet得到的数据库中的记录 2)预期结果写在相应的FlatXML文件中,我作为数据集读入

基本上可以通过这种方式比较2个数据集。

现在问题是带有时间戳的列。它们永远不会与预期的数据集结合在一起。在比较它们时我真的想忽略它们,但它并不像我想要的那样工作。

当我通过添加列过滤器和ignoreColumns来比较每个表时,它确实有效。然而,这个approch非常麻烦,因为在那个比较中使用了很多表,并强迫一个人添加这么多代码,它最终变得臃肿。 这同样适用于具有空值

的字段

如果我有机会只比较所有表的第一列 - 而不是通过用列名命名,而只用它的列索引命名,那么可能的解决方案也是如此。但是我找不到任何东西。

也许我错过了一些东西,或者它可能除了比较每个表格之外没有任何其他方法吗?

2 个答案:

答案 0 :(得分:3)

为了完成,必须发布一些附加信息。实际上,我之前发布的解决方案根本不起作用,因为从数据库读取数据的过程让我陷入困境。

使用“QueryDataset”的过程确实从数据库读取数据并将其保存为数据集,但无法再从该数据集访问数据(尽管我可以在调试模式下看到数据)! 相反,整个操作失败,在org.dbunit.database.ForwardOnlyResultSetTable.getRowCount(ForwardOnlyResultSetTable.java:73)

UnsupportedOperationException

产生失败的示例代码:

QueryDataSet qds = new QueryDataSet(connection);
qds.addTable(“specificTable”);
qds.getTable(„specificTable“).getRowCount(); 

即使你这样尝试也会失败:

IDataSet tmpDataset = connection.createDataSet(tablenames);
tmpDataset.getTable("specificTable").getRowCount();

为了进行提取工作,您需要添加此行(第二行):
IDataSet tmpDataset = connection.createDataSet(tablenames);
IDataSet actualDataset = new CachedDataSet(tmpDataset);

太好了,这没有记录......

但这不是全部:现在你肯定认为在做一个“QueryDataSet”之后也可以添加这一行......但是没有!这仍然不起作用!它仍将抛出相同的异常!这对我没有任何意义,我浪费了很多时间......

应该注意的是,从xml文件中读取的数据集中提取数据确实没有任何问题。当尝试直接从数据库获取数据集时,就会发生这种烦恼。

如果您已完成上述操作,则可以继续如下所示,仅比较您在预期的xml文件中获得的列:

    // put in here some code to read in the dataset from the xml file...
    // and name it "expectedDataset"
    // then get the tablenames from it...
    String[] tablenames = expectedDataset.getTableNames();

    // read dataset from database table using the same tables as from the xml
    IDataSet tmpDataset = connection.createDataSet(tablenames);
    IDataSet actualDataset = new CachedDataSet(tmpDataset);

    for(int i=0;i<tablenames.length;i++)
    {
        ITable expectedTable = expectedDataset.getTable(tablenames[i]);
        ITable actualTable = actualDataset.getTable(tablenames[i]);         
        ITable filteredActualTable = DefaultColumnFilter.includedColumnsTable(actualTable, expectedTable.getTableMetaData().getColumns());
        Assertion.assertEquals(expectedTable,filteredActualTable);
    }

答案 1 :(得分:0)

您也可以使用以下格式:

// Assert actual database table match expected table
String[] columnsToIgnore = {"CONTACT_TITLE","POSTAL_CODE"}; 
Assertion.assertEqualsIgnoreCols(expectedTable, actualTable, columnsToIgnore);