目前我需要为我的应用程序创建测试。我使用“dbunit”来实现这一点,现在需要比较2个数据集:
1)我用QueryDataSet得到的数据库中的记录 2)预期结果写在相应的FlatXML文件中,我作为数据集读入
基本上可以通过这种方式比较2个数据集。
现在问题是带有时间戳的列。它们永远不会与预期的数据集结合在一起。在比较它们时我真的想忽略它们,但它并不像我想要的那样工作。
当我通过添加列过滤器和ignoreColumns来比较每个表时,它确实有效。然而,这个approch非常麻烦,因为在那个比较中使用了很多表,并强迫一个人添加这么多代码,它最终变得臃肿。 这同样适用于具有空值
的字段如果我有机会只比较所有表的第一列 - 而不是通过用列名命名,而只用它的列索引命名,那么可能的解决方案也是如此。但是我找不到任何东西。
也许我错过了一些东西,或者它可能除了比较每个表格之外没有任何其他方法吗?
答案 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);