【问题标题】:Compare 2 datasets with dbunit?将 2 个数据集与 dbunit 进行比较?
【发布时间】:2012-09-12 13:29:45
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: testing junit dataset compare dbunit


    【解决方案1】:

    您也可以使用这种格式:

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

    【讨论】:

      【解决方案2】:

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

      使用“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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 2021-06-12
        相关资源
        最近更新 更多