为什么我的assertEquals()在JUnit中不推荐使用?

时间:2015-10-22 05:36:39

标签: java junit junit4

我想知道为什么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()会返回一个双精度值。

可能出现什么问题?

4 个答案:

答案 0 :(得分:64)

由于双精度问题,它已被弃用。

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

JavaDoc

  

断言两个双精度等于正三角形。如果不是,则抛出AssertionError。如果预期值为无穷大,则忽略delta值.NaNs被认为是相等的:assertEquals(Double.NaN, Double.NaN, *)传递

     

...

     

delta - 两个数字仍被视为相等的预期值与实际值之间的最大差值。

答案 1 :(得分:15)

人们解释但不要提供样品......所以这就是对我有用的东西:

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

最后0;

答案 2 :(得分:12)

不推荐使用

assertEquals(double, double),因为2个双精度数可能相同,但如果它们是计算值,则处理器可能会使它们略有不同。

如果您尝试此操作,则会失败:assertEquals(.1 + .7, .8)使用英特尔®处理器进行测试

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

答案 3 :(得分:0)

古老的问题,但这还没有被提及,可能会帮助别人。

您可以使用com.google.common.math.DoubleMath.fuzzyEquals(double a, double b, double tolerance)来指定两个双打之间的距离。

我发现它对于单元测试非常方便,因为我不想用很多小数位来硬编码测试结果值。