2015-10-22 22 views
20

Zastanawiam się, dlaczego assertEquals(double, double) jest przestarzałe.Dlaczego moja assertEquals() jest przestarzała w JUnit?

Użyłem import static org.junit.Assert.assertEquals; i użyłem JUnit 4.11.

Poniżej jest mój kod:

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() zwraca podwójną wartość.

Co może być nie tak?

+4

Jeśli po prostu przeczytasz javadoc, usłyszysz, co powinieneś użyć. – Andreas

Odpowiedz

35

Jest przestarzały z powodu problemów precyzji podwójnej.

Jeśli zauważysz, istnieje inna metoda, która pozwala na precyzyjną utratę wartości assertEquals(double expected, double actual, double delta).

JavaDoc:

stwierdza, że ​​dwa podwójna są równe w dodatnim delta. Jeśli nie, wywoływany jest błąd AssertionError. Jeżeli wartość oczekiwana nieskończoność czym wartość delta ignored.NaNs uważa równa: assertEquals(Double.NaN, Double.NaN, *) przechodzi

...

delta - maksymalna Różnica między oczekiwano i rzeczywista, dla której oba numery są nadal uważane za jednakowe.

+0

Jaki byłby dobry przykład delty? – jsh6303

+1

@JiajuShen, to zależy od twoich obliczeń ... Powiedzmy, że jeśli zrobisz '5.1 + 0.1', spodziewałbyś się' 5.2', ale wynik będzie wynosił '5.1999 ...'. Tak więc delta może wynosić "0.0001" ... Lub nawet mniej ... – Codebender

+0

Sprawdź ten [przykład] (https://github.com/junit-team/junit/blob/3e43555e1f4df95b0a239f453af6d3226a8fef6e/src/test/java/org /junit/tests/assertion/AssertionTest.java#L285) z kodu źródłowego JUnit lub tego [przykład] (https://github.com/junit-team/junit/blob/3e43555e1f4df95b0a239f453af6d3226a8fef6e/src/test/java/junit/ tests/framework/DoublePrecisionAssertTest.java) – Eric

8

assertEquals(double, double) jest przestarzałe, ponieważ 2 podwójne mogą być takie same, ale jeśli są to wartości wyliczone, procesor może wprowadzić nieco inne wartości.

Jeśli spróbujesz, to się nie powiedzie: assertEquals(.1 + .7, .8). Zostało to przetestowane przy użyciu procesora Intel®.

Wywołanie deprecated method spowoduje wywołanie fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers"); do wywołania.

+1

Przydatny przykład. –

9

Ludzie wyjaśnić, ale nie dają próbki ... Więc oto idzie co pracował dla mnie:

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

The 0 w końcu;

+0

Użycie 0.0 jako delta jest tym samym, co użycie nieaktualnej metody. Delta ma odzwierciedlać, jak bliskie mogą być liczby i nadal należy je traktować jako równe. Użyj wartości takich jak 0,1 lub 0,01 lub 0,001 itd., W zależności od tego, ile błędu aplikacja może tolerować. – downeyt

Powiązane problemy