web-dev-qa-db-fra.com

Pourquoi mon assertEquals () est-il déconseillé dans JUnit?

Je me demandais pourquoi assertEquals(double, double) est obsolète.

J'ai utilisé import static org.junit.Assert.assertEquals; et j'ai utilisé JUnit 4.11.

Ci-dessous mon code:

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() renvoie une double valeur.

Quel pourrait être le problème?

43
jsh6303

Il est déconseillé à cause des problèmes de précision du double.

Si vous remarquez, il existe une autre méthode assertEquals(double expected, double actual, double delta) qui permet une perte de précision delta.

JavaDoc :

Affirme que deux doubles sont égaux à un delta positif. Si ce n'est pas le cas, une erreur AssertionError est renvoyée. Si la valeur attendue est l'infini, la valeur delta est ignorée. Les NaN sont considérés comme égaux: assertEquals(Double.NaN, Double.NaN, *) passe 

...

delta - le delta maximum entre les résultats attendus et réels pour lequel les deux nombres sont toujours considérés comme égaux.

59
Codebender

Les gens expliquent mais ne donnent pas d'échantillons ... Voici ce qui a fonctionné pour moi

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

Le 0 à la fin;

14
Victor Augusto

assertEquals(double, double) est obsolète car les 2 doubles peuvent être identiques, mais s'ils sont calculés, le processeur peut leur attribuer des valeurs légèrement différentes.

Si vous essayez ceci, il échouera: assertEquals(.1 + .7, .8). Ceci a été testé avec un processeur Intel®.

L'appel de la méthode deprecated déclenchera l'appel de fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers");.

11
Eric

Vieille question, mais cela n'a pas encore été dit et pourrait aider quelqu'un.

Vous pouvez utiliser com.google.common.math.DoubleMath.fuzzyEquals(double a, double b, double tolerance) qui vous permet de spécifier à quel point les deux doubles doivent être proches l'un de l'autre. 

Je l’ai trouvé très pratique pour les tests unitaires où je ne veux pas coder en dur les valeurs de résultat de test avec beaucoup de décimales.

0
steven35