assertEquals(Double, Double) 和 assertEquals(double, double, delta) 之间的 Junit 区别

2022-09-03 17:36:19

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

Assert.assertEquals(Double expected, Double result);

这很好,然后我决定将其更改为使用原始双精度,除非您还提供delta,否则结果已被弃用。

所以我想知道的是,在这个断言等式中使用Double对象或基元类型有什么区别?为什么使用没有 delta 的对象是可以的,但是使用没有 delta 的基元是不推荐的?Java是否在后台执行了一些已经考虑了默认增量值的事情?

谢谢。


答案 1

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

assertEquals(Double expected, Double result);

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

assertEquals(Object expected, Object result);

这将调用对象的方法,正如您所期望的那样,不建议将其用于比较对象。equalsDouble

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

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

你的s将被悄无声息地拆箱,一切都会正常工作(你的测试不会意外失败:-)。Doubledouble


答案 2

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

另一方面,如果你正在比较盒装的s,它假设你想要确切的相等性。Java 没有考虑默认的增量值,但其行为与 略有不同,特别是它对 NaNs 的处理DoubleDouble.equals==

这在测试中是有意义的,因为在测试中,如果您期望一个 并返回,那就是一个正确的答案。Double.NaN != Double.NaNNaNNaN


推荐