为了完成,必须发布一些附加信息。实际上,我之前发布的解决方案根本不起作用,因为从数据库读取数据的过程让我陷入了困境。
使用“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);
}