15 Stimmen

Junit Unterschied zwischen assertEquals (Double, Double) und assertEquals (double, double, delta)

Ich hatte einen JUnit-Test, der zwei Double-Objekte mit dem folgenden verglich:

Assert.assertEquals(Double expected, Double result);

Zuerst war das in Ordnung, dann beschloss ich, es stattdessen mit dem primitiven double-Typ zu verwenden, der jedoch veraltet ist, es sei denn, Sie geben auch einen Delta-Wert an.

Also frage ich mich, was der Unterschied zwischen der Verwendung des Double-Objekts oder des primitiven Typs in diesem assertEquals ist. Warum ist die Verwendung der Objekte ohne Delta in Ordnung, aber dann die Verwendung der primitiven Typen ohne Delta veraltet? Macht Java im Hintergrund etwas, das bereits einen Standard-Deltawert berücksichtigt?

Danke.

21voto

Péter Török Punkte 111735

Es gibt KEINE assert-Methode in JUnit mit der Signatur

assertEquals(Double erwartet, Double Ergebnis);

Es gibt jedoch eine generische Methode für Objekte:

assertEquals(Object erwartet, Object Ergebnis);

Dies ruft die equals Methode der Objekte auf und wie Sie erwarten können, wird dies nicht empfohlen, um Double Objekte zu vergleichen.

Für Doubles ist es, wie Sie bemerkt haben, absolut notwendig, einen Delta für den Vergleich zu verwenden, um Probleme mit der Gleitkommazahlen-Rundung zu vermeiden (wie bereits in einigen anderen Antworten erklärt). Wenn Sie die 3-Argument-Version von assertEquals mit double Argumenten verwenden

assertEquals(double erwartet, double tatsächlich, double delta);

werden Ihre Double stillschweigend zu double unverpackt und alles funktioniert gut (und Ihre Tests scheitern nicht unerwartet :-).

7voto

Louis Wasserman Punkte 181854

Doppelte Mathematik gibt selten, wenn überhaupt, genau gleiche Ergebnisse. Zum Beispiel 0.1 * 0.1 != 0.01. Normalerweise benötigen Sie mindestens etwas Delta beim Vergleich von Double-Präzisions-Ergebnissen.

Andererseits, wenn Sie verpackte Doubles vergleichen, wird davon ausgegangen, dass Sie die exakte Gleichheit wollen. Java hat keinen standardmäßigen Delta-Wert berücksichtigt, aber Double.equals verhält sich etwas anders als ==: insbesondere bei der Behandlung von NaNs.

Dies ergibt Sinn beim Testen, denn Double.NaN != Double.NaN, aber in einem Test, wenn Sie ein NaN erwartet hatten und ein NaN zurückgegeben wurde, ist das eine korrekte Antwort.

7voto

Morozov Punkte 3987

Besser schreibe etwas wie folgt:

assertEquals(23.0, 250.0, 0.0)  

0.0 - das ist Delta. Lesen Sie, warum Ihre Methoden veraltet sind.

0voto

Akhi Punkte 2244

QUELLE. Stellt sicher, dass zwei Doubles oder Floats innerhalb eines positiven Delta gleich sind. Wenn nicht, wird ein AssertionError ausgelöst. Wenn der erwartete Wert unendlich ist, wird der Delta-Wert ignoriert. NaNs gelten als gleich.

0voto

duffymo Punkte 298898

Ich würde sagen, dass der Vergleich von Doubles, ob primitiv oder objekt, ohne einen Delta nutzlos ist. Das Verständnis von Gleitkommazahlen ist entscheidend für numerische Arbeiten.

Das Objekt verwendet möglicherweise .equals im Hintergrund; das Primitiv hat keine andere Option als ==.

Nur weil die Objektversion keinen Delta benutzt, bedeutet das nicht, dass das eine bessere Idee ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X