当前位置: 首页 > 知识库问答 >
问题:

如何比较JUnit中的两个double列表

司马自明
2023-03-14

在一个JUnit4测试中,我有一个getValues()方法,它返回一个List 对象,我要将它与引用列表进行比较。到目前为止,我发现的最佳解决方案是使用org.hamcrest.collection.isarray.hasitemsorg.hamcrest.matchers.closeto,如下所示:

assertThat(getValues(), hasItems(closeTo(0.2, EPSILON), closeTo(0.3, EPSILON)));

对于只返回很少值的测试来说,这是很好的。但是如果一个测试返回更多的值,这肯定不是最好的方法。

我还尝试了下面的代码。要编译代码,需要在HasItems之前向下转换到匹配器

List<Matcher<Double>> doubleMatcherList = new ArrayList<Matcher<Double>>();
doubleMatcherList.add(closeTo(0.2, EPSILON));
doubleMatcherList.add(closeTo(0.3, EPSILON));
assertThat(getValues(), (Matcher) hasItems(doubleMatcherList));

对比失败了,不明白为什么:

java.lang.AssertionError:预期:(包含<[<0.2>的<1.0E-6>内的数值,<0.3>的<1.0E-6>内的数值]>)的集合得到:<[0.2,0.300000000000000004]>

有没有更好的方法来对比两个双打的大名单呢?这里的困难在于,需要一个数值容差来验证getValues()的结果是否等于我的参考列表。对于任何对象列表,这种比较似乎都很容易,但对于double列表则不然。

共有1个答案

戈念
2023-03-14

我认为这里的正确解决方案将是一个自定义匹配器。基本上,像IsIterableContainingInOrder这样的东西只在Doubles上工作,并且支持错误裕度。

 类似资料:
  • 问题内容: Java中两个double值的简单比较会产生一些问题。让我们考虑以下Java中的简单代码段。 上面的代码似乎返回,表达式的求值,但是没有。它之所以返回,是因为该表达式的求值实际上是预期的因此不等于,因此条件的求值为。解决这种情况的最佳建议方法是什么? 问题答案: 基本上,你不应该进行精确比较,而应该执行以下操作:

  • 这是一个Java代码,应该测试小数点后的前三位是否相同。而我需要编写这个程序没有一个主方法。

  • 这与Java比较两个列表的不同之处在于,我需要能够在jUnit中断言相等性,而不仅仅是比较列表。

  • 我有两个表,分别是产品和采购: PRODUCTS表-将获得购买的所有新产品。这意味着表prroducts中不存在相同的productname。所有独特产品列表 采购表-具有唯一purchase_id的所有采购产品的列表。 > 如果要在PURCHASE中添加或插入值,表PRODUCTS将获得PURCHASE的所有值,但前提是PURCHASE中的productname不存在于PRODUCTS中的'pr

  • 问题内容: 可以说我有两个带有SSN变量的表,并且我想显示仅在一个表中的表,而不是两个表中的表。 正确的方法是什么? 问题答案: 这是一种方法: 这适用于大多数数据库,但不适用于MySQL。以下内容几乎可以在任何数据库中工作:

  • 问题内容: 如果我有一个长长的清单:我分为两个清单: 我如何比较这两个列表以查看它们是否相等/相同,并约束它们必须具有相同的顺序? 我看到过一些问题,要求通过对两个列表进行排序来进行比较,但是在我的特定情况下,我不是要检查排序的比较,而是要检查相同的列表比较。 问题答案: 只需使用经典运算符: 如果相同索引处的元素相等,则列表相等。然后考虑订购。