为什么JUnit中的assertEquals(double,double)被弃用了?

96

我在想为什么assertEquals(double, double)已经被弃用。

我使用了import static org.junit.Assert.assertEquals;以及JUnit 4.11。

以下是我的代码:

import org.junit.Test;
import static org.junit.Assert.assertEquals;


public class AccountTest {

@Test
public void test() {
    Account checking = new Account(Account.CHECKING);
    checking.deposit(1000.0);
    checking.withdraw(100.0);
    assertEquals(900.0, checking.getBalance());
   }
}

checking.getBalance() 返回一个 double 类型的值。

可能出了什么问题?


6
如果你只是查看Javadoc,你将被告知该使用什么替代方法。 - Andreas
尝试使用类似 Assert.assertEquals(2.49, 2.49, 0.1); 的方式。 - Arjun Kalidas
如果我是JUnit,我会因为使用double来表示货币金额而不是某个第三方库类或专门用于货币的自定义类而使测试失败。 - Alonso del Arte
4个回答

115

由于double类型存在精度问题,该方法已被弃用。

如果您注意到,还有另一种方法assertEquals(double expected, double actual, double delta),它允许有一个delta的精度损失。

JavaDoc:

断言两个double类型数值之间的差小于指定的正数delta。如果不是,则抛出AssertionError。如果期望值为无穷大,则忽略delta值。NaN值被认为是相等的:assertEquals(Double.NaN, Double.NaN, *) 通过测试。

...

delta - 期望值和实际值之间最大差异,当两个数字仍被视为相等时使用。


1
@JiajuShen,这取决于你的计算...比如说,如果你做 5.1 + 0.1,你期望得到 5.2,但实际输出是 5.1999...。因此,差值可能是 0.0001...甚至更小... - Codebender
1
请查看JUnit源代码中的示例或者这个示例 - Eric

28

人们解释但不给出实例...所以我来分享一下对我有效的方法:

@Test
public void WhenMakingDepositAccountBalanceIncreases() {
    Account account = new Account();
    account.makeDeposit(10.0);
    assertEquals("Account balance was not correct.", 10.0, account.getBalance(), 0);
}

结尾处的0;


15
将delta设为0.0与使用已弃用的方法相同。delta的目的是反映数字可以多接近才能被视为相等。根据应用程序可容忍的误差程度,使用像0.1、0.01或0.001等值。 - downeyt
3
这是一个错误的建议。使用“0”完全破坏了使用未弃用方法的目的。这与使用弃用的变体完全相同。这甚至更加危险,因为您不再收到警告。认识到它被弃用的原因,使用一个小的增量,比如“0.00001”。 - Zabuzard

22

assertEquals(double, double) 因为两个双精度浮点数可能是相同的,但如果它们是计算出来的值,处理器可能会使它们稍微不同。

如果您尝试这样做,它将失败:assertEquals(.1 + .7, .8)此测试使用 Intel® 处理器进行了测试

调用弃用的方法将触发fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers"); 被调用。


2

虽然这个问题已经很老了,但还没有人提到这一点,这可能会对某些人有所帮助。

您可以使用com.google.common.math.DoubleMath.fuzzyEquals(double a, double b, double tolerance),它允许您指定两个double之间应该有多接近。

我发现在单元测试中非常方便,因为我不想硬编码具有许多小数位的测试结果值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接