Подтвердить что ты не робот

Почему 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() возвращает двойное значение.

Что может быть неправильным?

4b9b3361

Ответ 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), который позволяет вам указать, насколько близко два двойника должны быть друг к другу.

Я нашел это очень удобным для модульных тестов, где я не хочу жестко кодировать значения результатов теста с большим количеством десятичных знаков.