在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)));
这对于只返回很少值的测试非常有效。但是,如果测试返回更多值,则绝对不是最佳方法。
我也尝试了以下代码。代码编译需要向下转换到Matcher
之前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.2E的<1.0E-6>内的数值,<0.3>的<1.0E-6>内的数值的集合)): 0.2,0.30000000000000004]>
有没有更好的方法比较两个较大的双打列表?这里的困难在于,需要使用数值公差来验证的结果getValues()
是否等于我的参考列表。对于任何对象列表而言,这种比较似乎都很容易,但对于对象列表而言却并非如此Double
。
我认为这里的正确解决方案是Custom Matcher。基本上像IsIterableContainingInOrder之类的东西仅适用于Doubles并支持错误余量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句