私はJUnit5に関する更新に答えています。バージョンに関係なく、assertEquals(Double expected, Double actual)
にルーティングされますassertEquals(Object expected, Object actual)
。これは、他の人がすでに説明したように、Double
暗黙的に拡張するプリミティブラッパーであるためObject
です。
ただし、assertEquals(double expected, double actual)
(2つのプリミティブラッパーではなく2つのプリミティブを使用して)JUnit 4コンテキストでは、非推奨のプロシージャが呼び出されます。JUnit 3ですでに非推奨になっているのかどうかはわかりませんが、JUnit5では非推奨ではありません。
のような浮動小数点タイプdouble
は本質的に不正確です。と仮定しexpected = 0.3
ます。どのようにactual
計算されますか?その場合3.0 / 10
、結果は正確である可能性があります。しかし、それが悪名高い場合0.1 + 0.2
は、0.00000000000000004だけオフになります(0.3を引くと、どういうわけか5.551115123125783×10 -17になります)。
一般的に、浮動小数点の乗算と除算は、浮動小数点の加算と減算よりも信頼性があります。
次の例は、org.junit.jupiter.api.Assertions.*
静的インポートを使用したテストクラスからのものです。
@Test
void testDeltaExample() {
double expected = 0.3;
double actual = 0.1 + 0.2;
assertEquals(expected, actual);
}
結果:
org.opentest4j.AssertionFailedError:予期された:<0.3>が、だった:<0.30000000000000004> at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)at org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils .java:62)org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:70)at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:65)atorg.junit.jupiter。 api.Assertions.assertEquals(Assertions.java:868)..。
そのように少しずれていても気になりますか?そうでない場合は、0.0000000000000001のようなデルタが必要になります。
必要に応じて、JUnit 5の「ビンテージ」JUnitを引き続き使用できます(ただし、既存のテストスイートを移行する場合、または移行できることを確認する場合以外の理由で使用することはできません)。
@Test
void testDeltaExample() {
double expected = 0.3;
double actual = 0.1 + 0.2;
org.junit.Assert.assertEquals(expected, actual);
}
(IDEは、閉じ中括弧の前の行に取り消し線を表示する必要があります)。このテストは、ビットパターンがまったく同じexpected
であっても失敗します(この例では失敗します)。actual
java.lang.AssertionError:assertEquals(expected、actual、delta)を使用して、org.junit.Assert.assertEquals(Assert.java:667)のorg.junit.Assert.fail(Assert.java:88)の浮動小数点数を比較します。 )org.junit.Assert.assertEquals(Assert.java:656)で..。
SQL結合などの複雑なことを学んだ非常にインテリジェントなJavaプログラマーの多くは、浮動小数点数について学ぶことを気にしないため、0.0のデルタを使用しました。
そのため、JUnit開発者は、浮動小数点の可能性について人々を教育するのは彼らの仕事ではないと判断したようです。したがってorg.junit.jupiter.api.Assertions.assertEquals(double expected, double actual)
、技術的には新しく、非推奨ではありません。
完全に明確にするために、デルタとの浮動小数点の比較は、JUnit 5でも引き続き使用できます。Scalaの観点からは、これをと見なすことができますassertEquals(expected: Double, actual: Double, delta: Double = 0.0)
。