【发布时间】:2016-03-15 15:15:09
【问题描述】:
在 JUnit 4 测试中,我有一个方法 getValues(),它返回一个 List<Double> 对象,我想将该对象与参考列表进行比较。到目前为止,我发现的最佳解决方案是像这样使用org.hamcrest.collection.IsArray.hasItems 和org.hamcrest.Matchers.closeTo:
assertThat(getValues(), hasItems(closeTo(0.2, EPSILON), closeTo(0.3, EPSILON)));
这适用于只返回少量值的测试。但是如果一个测试返回更多的值,这绝对不是最好的方法。
我还尝试了以下代码。编译代码需要在hasItems 之前向下转换为Matcher:
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: 预期:(包含 的 内的数值, 的 内的数值]> 的集合) 得到:
有没有更好的方法来比较两个大的双打列表?这里的困难是需要一个数值公差来验证getValues() 的结果是否等于我的参考列表。对于任何对象列表,这种比较似乎都非常容易,但对于 Double 列表则不然。
【问题讨论】:
-
有一个总是有效的解决方案:我遍历 getValues() 的值并与我的参考值进行一对一的比较。我想知道是否有使用 Matchers 的更简单的解决方案。
-
测试驱动开发 - 实施由您的测试驱动。如果某些东西难以测试,那么您可能做得不对。您不能为双打列表编写测试 - 不要使用双打。为什么不使用整数/长整数或
BigDecimals? -
@Jaroslav 此测试发生在执行密集数值计算的应用程序中。所以不使用双打列表是不可能的。
-
@Francois 您正在尝试解决问题,而不是解决问题的原因。这些双标代表什么?为什么精度很重要?为什么你的 epsilon 是 0.0001 而不是 0.000001 或 0.1?
-
@Jaroslav 在我给出的示例中,这些值是 0.1 和 0.4 之间线性插值的结果,增量为 0.1。我希望测试返回一个包含 0.2 和 0.3 作为缺失值的列表。这是我必须测试的最简单的情况之一。此测试失败,因为列表包含 0.2 和 0.300000004,除非我使用适当的匹配器。