的assertEquals(双,双)和的assertEquals(双,双,增量)之间的Junit差(

2019-06-25 21:05发布

我有一个JUnit测试断言两双对象有以下几点:

Assert.assertEquals(Double expected, Double result);

这是很好然后我决定改变使用基本的double而不是里面竟然被弃用,除非您还提供了一个三角洲。

所以我想知道什么是什么是使用双重目标或在此的assertEquals基本类型之间的区别? 为什么使用对象,而不确定的增量,但然后使用无增量的原语已经过时? 就是Java做的已经有考虑到一个默认的delta值的背景是什么?

谢谢。

Answer 1:

没有使用JUnit断言方法与签名

assertEquals(Double expected, Double result);

还有一个,不过,通用的对象:

assertEquals(Object expected, Object result);

这将调用对象的equals方法,正如你所期望的,所以不建议使用这种比较Double对象。

对于双打,当你观察到的,这是绝对必要使用增量进行比较,以避免浮点舍入的问题(在其他一些答案解释的话)。 如果你使用的3参数版本assertEqualsdouble参数

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

你的Double旨意让默默拆箱到double ,一切都将正常工作(和你的测试不会失败意外:-)。



Answer 2:

双数学很少,如果给出了完全相等的结果。 例如, 0.1 * 0.1 != 0.01 。 你通常需要至少在比较双精度结果有一定增量。

在另一方面,如果您要比较盒装Double S,它假定你想要的确切平等。 Java没有考虑到一个默认的delta值,但Double.equals具有略微不同的行为== :特别是, 其处理的NaN 。

这使得在测试的意义,因为Double.NaN != Double.NaN ,但在测试中,如果你希望一个NaNNaN返回,这是一个正确的答案。



Answer 3:

最好写是这样的:

assertEquals(23.0, 250.0, 0.0)  

0.0 - 它是三角形。 了解为什么你的方法已被弃用。



Answer 4:

资源。 断言两个双打或浮筒都等于一个正增量内。 如果不是,一个AssertionError被抛出。 如果预期值为无穷大,则差值是ignored.NaNs被视为相等。



Answer 5:

我想说的是比较双打,原始或对象,是一个没有增量没用。 知道如何流动的点数工作的关键是做数字工作。

对象使用的可能是幕后.equals; 原始具有除了==别无选择。

只是因为对象版本没有使用的增量,并不意味着更好的主意。



文章来源: Junit difference between assertEquals(Double, Double) and assertEquals(double, double, delta)