Ich habe mich gefragt warum assertEquals(double, double)
veraltet ist.
ich benutzte import static org.junit.Assert.assertEquals;
habe JUnit 4.11 und verwendet.
Unten ist mein 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()
gibt einen doppelten Wert zurück.
Was könnte falsch sein?
Assert.assertEquals(2.49, 2.49, 0.1);
double
zur Darstellung von Geldbeträgen anstelle einer Bibliotheksklasse eines Drittanbieters oder einer benutzerdefinierten Klasse speziell für Geld nicht bestehen.Antworten:
Es ist wegen der Präzisionsprobleme des Doppelten veraltet.
Wenn Sie bemerken, gibt es eine andere Methode
assertEquals(double expected, double actual, double delta)
, die einendelta
Präzisionsverlust ermöglicht .JavaDoc :
quelle
5.1 + 0.1
, würden Sie erwarten,5.2
aber die Ausgabe wäre5.1999...
. So kann das Delta sein0.0001
... oder noch weniger ...Die Leute erklären, geben aber keine Proben ... Also hier ist, was für mich funktioniert hat:
@Test public void WhenMakingDepositAccountBalanceIncreases() { Account account = new Account(); account.makeDeposit(10.0); assertEquals("Account balance was not correct.", 10.0, account.getBalance(), 0); }
Das
0
am Ende;quelle
0
vollständige Verwendung wird der Zweck der Verwendung der nicht veralteten Methode zunichte gemacht. Es ist genau das gleiche wie bei Verwendung der veralteten Variante. Dies ist umso gefährlicher, als Sie keine Warnung mehr erhalten. Erkennen Sie den Grund, warum es veraltet war, und verwenden Sie ein kleines Delta wie0.00001
.assertEquals(double, double)
wird nicht mehr empfohlen, da die beiden Doppelwerte möglicherweise gleich sind. Wenn es sich jedoch um berechnete Werte handelt, kann der Prozessor sie zu geringfügig unterschiedlichen Werten machen.Wenn Sie dies versuchen, wird es fehlschlagen :
assertEquals(.1 + .7, .8)
. Dies wurde mit einem Intel® Prozessor getestet .Wenn Sie die veraltete Methode aufrufen, wird der Aufruf ausgelöst
fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers");
.quelle
Alte Frage, aber das wurde noch nicht gesagt und könnte jemandem helfen.
Mit können
com.google.common.math.DoubleMath.fuzzyEquals(double a, double b, double tolerance)
Sie festlegen, wie nahe die beiden Doppelbilder beieinander liegen sollen.Ich fand es sehr praktisch für Unit-Tests, bei denen ich Testergebniswerte nicht mit vielen Dezimalstellen fest codieren möchte.
quelle