Junit Unterschied zwischen assertEquals(Double, Double) und assertEquals(double, double delta)
Hatte ich einen junit test behaupten zwei Double-Objekte mit den folgenden:
Assert.assertEquals(Double expected, Double result);
Dieser war war in Ordnung dann habe ich beschlossen, es zu ändern, um die Verwendung der primitive Doppel statt, die sich als veraltet, es sei denn, Sie bieten auch ein delta.
also, was ich mich Frage ist, was ist der Unterschied zwischen der Verwendung der Double-Objekt oder die primitiv-Typ in diesem assertEquals? Warum ist die Verwendung der Objekte, ohne eine delta ok aber dann mit den primitiven ohne delta ist veraltet? Ist Java etwas in den hintergrund, die bereits die Standard-delta-Wert berücksichtigt?
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es KEINE assert-Methode in JUnit mit der Unterschrift
Es ist jedoch generische für Objekte:
Dieser ruft die Objekte
equals
- Methode und wie man es erwarten kann, ist es nicht empfohlen, diese für den VergleichDouble
Objekte.Für Doppel -, als Sie beobachtet, ist es absolut notwendig, einen delta zum Vergleich, Probleme zu vermeiden, die mit floating-point Rundung (erklärt sich bereits in einigen anderen Antworten). Wenn man die 3-argument-version von
assertEquals
mitdouble
ArgumenteIhre
Double
s werden stillschweigend ohne Verpackung zudouble
und alles funktioniert Prima (und Ihre tests nicht fehlschlagen unerwartet :-).double e
ist der erwartete Wert, dann delta solltedouble d = Math.pow(10, Math.log10(Math.abs(e)) - 12);
wo12
ist die maximale praktische Anzahl von signifikanten Ziffern. Wenn Sie multiplizieren Sie den log10-Wert von < 1.0, dann test schlägt fehl, füre
mit großen positiven Exponenten und, auf dem Gegenteil, wenn Sie das multiplizieren von log10-Wert > 1.0, wird es nicht füre
mit großen negativen Exponenten — und dies ist der Effekt, den Sie waren, darüber zu schreiben. So stellen Sie sicher, delta gut passen zu den Exponenten der erwartete Wert.Double math selten, wenn überhaupt, gibt genau gleichwertige Ergebnisse. Zum Beispiel
0.1 * 0.1 != 0.01
. Sie benötigen in der Regel mindestens einige delta im Vergleich von double-precision-Ergebnisse.Auf der anderen Seite, wenn Sie sich den Vergleich boxed
Double
s, es wird davon ausgegangen, Sie wollen die exakte Gleichheit. Java verfügt nicht über eine Standard-delta-Wert berücksichtigt, aberDouble.equals
hat leicht unterschiedliche Verhalten von==
: insbesondere die Behandlung von NaNs.Dies ist dann sinnvoll testen, weil
Double.NaN != Double.NaN
, aber in einem test, wenn Sie erwarten, dass einNaN
undNaN
zurückgegeben wurde, das ist eine richtige Antwort.Schreib besser etwas wie:
0.0 - es ist das delta. Lesen Sie, warum deins Methoden sind veraltet.
QUELLE.
Behauptet, dass zwei doubles oder floats sind gleich in einem positiven delta. Wenn nicht, wird ein AssertionError geworfen. Wenn der erwartete Wert ist die Unendlichkeit dann wird der delta-Wert wird ignoriert.NaNs werden als gleich angesehen.
Ich würde sagen, dass der Vergleich verdoppelt, primitiv oder Objekt, ist nutzlos, ohne ein delta. Zu wissen, wie fließende point-zahlen arbeiten, ist der Schlüssel zu tun, numerische arbeiten.
Objekt verwenden könnten .gleich unter der Decke; der primitive hat keine Möglichkeit, neben ==.
Nur weil die Objekt-version nicht mit einem delta nicht, dass eine bessere Idee.