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



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

1) 我使用QueryDataSet从数据库中获得的记录
2)预期结果以适当的FlatXML写入我作为数据集读取的文件中

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

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

当我通过添加列过滤器和ignoreColumns来比较每个表的情况时,它确实有效。然而,这种方法非常麻烦,因为在这种比较中使用了许多表,并迫使一个人添加太多代码,最终会变得臃肿。这同样适用于具有空值的字段

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

也许我遗漏了什么,也许它除了比较每张表之外没有其他任何作用?

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

使用"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(表名)
IDataSet actualDataset=新的CachedDataSet(tmpDataset)

太好了,这件事没有任何记录。。。

但这还不是全部:现在你肯定会认为,在完成"QueryDataSet"之后也可以添加这一行。。。但是没有!这仍然不起作用!它仍然会抛出相同的Exception!这对我来说没有任何意义,我浪费了太多时间…

需要注意的是,从从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);
}

您也可以使用以下格式:

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

相关内容

  • 没有找到相关文章

最新更新