【问题标题】:Junit | comparing dynamic objects君特 |比较动态对象
【发布时间】:2012-09-14 09:28:45
【问题描述】:

我如何比较 Junit 中的动态对象类型,例如:-

while (objList.hasNext()) {
      Object<String> obj = objList.next();
      Assert.assertEquals("expected", obj); 
}

在这种情况下,如果一次失败,则整个测试将失败。如果我在断言测试之前使用条件来确定预期的字符串,这是一个好方法吗?

像这样:

while (objList.hasNext()) {
      Object<String> obj = objList.next();
      if (obj.equals("expected")) {
           Assert.assertEquals("expected", obj); 
      }
}

但在这种情况下,没有必要进行 Junit 断言测试。因为我已经在做 Junit 打算做的事情了 谢谢。

【问题讨论】:

  • 添加什么条件?你能举个例子吗?
  • 你想知道如何断言对象相等还是什么?你的最后一句话似乎要求别的东西。
  • 我的意思是如果我添加一个“if, else”条件来检查预期的字符串是否在列表中
  • 您能否澄清一下预期的行为?您是否希望仅当所有元素都不同时测试才会失败?什么与什么比较 - 是每个元素都与相同的值进行比较,还是比较两个不同动态结构中的元素?

标签: java unit-testing testing junit


【解决方案1】:

看看ErrorCollector Rule

它允许您“收集”错误并最终输出它们。如果你使用它,JUnit 不会在第一个错误时失败。

【讨论】:

    【解决方案2】:

    你在这里问什么并不完全清楚。如果我们知道您在迭代什么会更容易,但假设它是一个 Iterable,您最好查看 hamcrest matchers

    例如

    asserThat(objList, Matchers.hasItem(expected);
    

    如果期望值等于您的可迭代元素中的元素,则将通过。查看与 junit 捆绑的匹配器,或将外部 hamcrest 库添加到您的测试项目中。

    【讨论】:

      【解决方案3】:

      我为更大的数据结构做的是使用一个明智的 toString() 方法并比较它。

      例如

      assertEquals(""+expected, ""+obj);
      assertEquals(expected, obj);
      

      这样做的原因是通过 IDE(向您展示差异)或文本比较,您可以看到所有不同的值以及它们的不同之处。第二个检查是确认它们确实是相等的。

      【讨论】:

      • 这个答案假定foo.toString().equals(bar.toString()) 暗示foo.equals(bar)String 的例子确实如此,但可能不是一般的。
      • 双重检查意味着如果foo.toString().equals(bar.toString())为假,那么foo.equals(bar)也为假,这通常不是真的,但如果你使toString()或自定义asString()能够显示有意义的数据,它可能很有用。
      【解决方案4】:

      您可以使用基于数组的断言。为此,您必须将枚举转换为数组。

      Object[] enumAsArray = Collections.list(objList).toArray();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-15
        • 2013-11-01
        • 2023-03-16
        • 2012-04-15
        • 2011-07-09
        • 2011-09-30
        • 1970-01-01
        相关资源
        最近更新 更多