assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异

我有一个junit测试断言两个Double对象具有以下内容:

Assert.assertEquals(Double expected, Double result); 

这很好,然后我决定将其更改为使用原始的double而不是最近被弃用,除非你还提供了delta。

所以我想知道在这个assertEquals中使用Double对象或原始类型有什么区别? 为什么在没有delta的情况下使用对象,但是不推荐使用没有delta的基元? Java是否在后台运行已经考虑了默认delta值的东西?

谢谢。

JUnit中没有带签名的断言方法

 assertEquals(Double expected, Double result); 

但是,对象有一个通用的:

 assertEquals(Object expected, Object result); 

这会调用对象的equals方法,正如您所料,不建议使用它来比较Double对象。

对于双精度数,正如您所观察到的,绝对有必要使用delta进行比较,以避免浮点舍入问题(在其他一些答案中已有解释)。 如果使用带有double参数的3参数版本的assertEquals

 assertEquals(double expected, double actual, double delta); 

你的Double s将被静默地取消装箱,并且一切都会正常工作(你的测试不会意外地失败:-)。

双重数学很少,如果给出完全相同的结果。 例如, 0.1 * 0.1 != 0.01 。 在比较双精度结果时,通常至少需要一些增量。

另一方面,如果你比较盒装的Double ,它假设你想要完全相等。 Java没有考虑默认的delta值,但Double.equals==行为略有不同:特别是它对NaN的处理 。

这在测试中是有意义的,因为Double.NaN != Double.NaN ,但在测试中,如果你期望返回NaNNaN ,那就是正确的答案。

资源。 断言两个双精度或浮点数等于正三角形。 如果不是,则抛出AssertionError。 如果期望值是无穷大,则忽略delta值.NaNs被认为是相等的。

我会说比较双打,原始或对象,没有三角洲就没用了。 了解流动点数如何工作是进行数值工作的关键。

该对象可能在封面下使用.equals; 除了==之外,原语没有选项。

仅仅因为对象版本没有使用delta,这并不是一个更好的主意。

更好地写这样的东西:

 assertEquals(23.0, 250.0, 0.0) 

0.0 – 它是delta。 了解为什么不推荐使用您的方法。