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

jsh*_*303 58 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());
   }
}
Run Code Online (Sandbox Code Playgroud)

checking.getBalance() 返回一个double值.

可能有什么不对?

Cod*_*der 76

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

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

JavaDoc:

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

...

delta - 两个数字仍然被认为相等的预期和实际之间的最大增量.


Eri*_*ric 15

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

如果你试试这会失败:assertEquals(.1 + .7, .8).这是使用英特尔®处理器测试的.

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


Vic*_*sto 14

人们解释但不提供样品......所以这里对我有用:

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

0到底;

  • 使用0.0作为delta与使用弃用的方法相同.三角形旨在反映数字的接近程度,并且仍然被认为是相等的.使用值为0.1或0.01或0.001等,具体取决于应用程序可以容忍的错误数量. (10认同)
  • 这是一个不好的建议。使用'0'完全违反了使用未弃用方法的目的。与使用不推荐使用的变体完全相同。由于您不再收到警告,因此更加危险。确认不推荐使用的原因,并使用`0.00001'之类的小变化量。 (2认同)