2015-10-22 1 views
20

Je me demandais pourquoi assertEquals(double, double) est déprécié. Je ai utilisé import static org.junit.Assert.assertEquals; et j'ai utilisé JUnit 4.11.Pourquoi mon assertEquals() est-il obsolète dans JUnit?

est mon code ci-dessous:

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

Qu'est-ce qui pourrait ne pas fonctionner?

+4

Si vous lisez simplement javadoc, on vous dira quoi utiliser à la place. – Andreas

Répondre

35

Il est déconseillé en raison 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:

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

...

delta - delta maximale entre le rendement prévu et réel pour lequel les deux nombres sont toujours considérés comme égaux.

+0

Quel serait un bon exemple de delta? – jsh6303

+1

@JiajuShen, cela dépend de vos calculs ... Disons que si vous faites '5.1 + 0.1', vous attendez' 5.2' mais la sortie serait '5.1999 ...'. Donc, le delta peut être '0,0001' ... Ou même moins ... – Codebender

+0

Consultez cet exemple [https://github.com/junit-team/junit/blob/3e43555e1f4df95b0a239f453af6d3226a8fef6e/src/test/java/org /junit/tests/assertion/AssertionTest.java#L285) à partir du code source de JUnit ou de ce [exemple] (https://github.com/junit-team/junit/blob/3e43555e1f4df95b0a239f453af6d3226a8fef6e/src/test/java/junit/ tests/framework/DoublePrecisionAssertTest.java) – Eric

8

assertEquals(double, double) est dépréciée parce que les 2 doubles peuvent être les mêmes, mais si elles sont des valeurs calculées le processeur peut les rendre des valeurs légèrement différentes.

Si vous essayez ceci, il échouera: assertEquals(.1 + .7, .8). Ceci a été testé en utilisant un processeur Intel®. L'appel du deprecated method déclenchera fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers"); pour être appelé.

+1

Exemple utile. –

9

Les gens expliquent, mais ne donnent pas d'échantillons ... donc voilà 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;

+0

L'utilisation de 0.0 comme delta est identique à l'utilisation de la méthode obsolète. Le delta a pour but de refléter le degré de proximité des chiffres et d'être toujours considéré comme égal. Utilisez des valeurs telles que 0,1 ou 0,01 ou 0,001, etc., en fonction de l'erreur tolérée par l'application. – downeyt