Почему assertEquals (double, double) не рекомендуется в JUnit?
Мне было интересно, почему 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()
возвращает двойное значение.
Что может быть неправильным?
Ответы
Ответ 1
Он устарел из-за проблем с двойной точностью.
Если вы заметили, есть еще один метод assertEquals(double expected, double actual, double delta)
, который допускает потерю точности delta
.
JavaDoc:
Утверждается, что два удвоения равны внутри положительной дельта. Если это не так, запускается AssertionError. Если ожидаемое значение равно бесконечности, значение треугольника игнорируется. NaN считаются равными: assertEquals(Double.NaN, Double.NaN, *)
проходит
...
delta - максимальная дельта между ожидаемыми и действительными, для которых оба числа по-прежнему считаются равными.
Ответ 2
assertEquals(double, double)
не рекомендуется, потому что 2 двойные могут быть одинаковыми, но если они являются вычисленными значениями, процессор может сделать их немного отличающимися значениями.
Если вы попробуете это, это не получится: assertEquals(.1 + .7, .8)
. Это было проверено с использованием процессора Intel®.
Вызов устаревшего метода вызовет вызов fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers");
.
Ответ 3
Люди объясняют, но не дают образцы... Итак, здесь идет то, что сработало для меня:
@Test
public void WhenMakingDepositAccountBalanceIncreases() {
Account account = new Account();
account.makeDeposit(10.0);
assertEquals("Account balance was not correct.", 10.0, account.getBalance(), 0);
}
0
в конце;
Ответ 4
Старый вопрос, но это еще не было сказано и может кому-то помочь.
Вы можете использовать com.google.common.math.DoubleMath.fuzzyEquals(double a, double b, double tolerance)
, который позволяет вам указать, насколько близко два двойника должны быть друг к другу.
Я нашел это очень удобным для модульных тестов, где я не хочу жестко кодировать значения результатов теста с большим количеством десятичных знаков.