1

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

1)我使用 QueryDataSet 获得的数据库中的记录
2)预期的结果写在一个文件中的适当 FlatXML 中,我也将其作为数据集读入

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

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

当我通过添加列过滤器和 ignoreColumns 比较每个表时,它确实有效。但是,这种方法非常繁琐,因为在比较中使用了很多表,并且迫使一个人添加了很多代码,最终变得臃肿。这同样适用于具有空值的字段

一个可能的解决方案也是,如果我有机会只比较所有表的第一列 - 而不是用它的列名来命名它,而只是用它的列索引来命名。但是我什么也找不到。

也许我遗漏了一些东西,或者除了比较每个表本身之外,它没有任何其他作用?

4

2 回答 2

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);
    }
于 2012-09-21T12:57:42.267 回答
0

您也可以使用这种格式:

// Assert actual database table match expected table
String[] columnsToIgnore = {"CONTACT_TITLE","POSTAL_CODE"}; 
Assertion.assertEqualsIgnoreCols(expectedTable, actualTable, columnsToIgnore);
于 2013-06-25T13:15:31.617 回答