我想知道为什么不推荐使用 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()
返回一个双精度值。
有什么问题?
Assert.assertEquals(2.49, 2.49, 0.1);
一样使用它
double
来表示货币金额而不是某些第三方库类或专门用于货币的自定义类的测试。
由于双精度问题,它已被弃用。
如果您注意到,还有另一种方法 assertEquals(double expected, double actual, double delta)
,它允许 delta
精度损失。
断言两个双精度数在正增量内相等。如果不是,则抛出 AssertionError。如果期望值为无穷大,则忽略 delta 值。NaN 被视为相等: assertEquals(Double.NaN, Double.NaN, *) 通过 ... delta - 仍考虑两个数字的预期和实际之间的最大 delta平等的。
人们解释但不提供样品......所以这对我有用:
@Test
public void WhenMakingDepositAccountBalanceIncreases() {
Account account = new Account();
account.makeDeposit(10.0);
assertEquals("Account balance was not correct.", 10.0, account.getBalance(), 0);
}
最后的0
;
0
完全违背了使用未弃用方法的目的。这与使用不推荐使用的变体完全相同。这更加危险,因为您不再收到警告。确认它被弃用的原因并使用像 0.00001
这样的小增量。
assertEquals(double, double)
已弃用,因为 2 个双精度值可能相同,但如果它们是计算值,处理器可能会使它们的值略有不同。
如果您尝试此操作,它将失败:assertEquals(.1 + .7, .8)
。 这是使用英特尔® 处理器测试的。
调用 deprecated method 将触发调用 fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers");
。
老问题,但这还没有说出来,可能会对某人有所帮助。
您可以使用 com.google.common.math.DoubleMath.fuzzyEquals(double a, double b, double tolerance)
,它允许您指定两个双打应该彼此接近的程度。
我发现它对于单元测试非常方便,我不想用很多小数位硬编码测试结果值。
不定期副业成功案例分享
5.1 + 0.1
,您会期望5.2
,但输出将是5.1999...
。所以 delta 可以是0.0001
... 甚至更小...