我有一个关于JUnit assertEquals测试双值的问题。阅读API文档,我可以看到:

@Deprecated 公共静态无效assertEquals(double expected, double actual) 弃用。使用assertEquals(double expected, double actual, double delta)代替。

(注意:在较旧的文档版本中,delta参数称为epsilon)

(或)参数是什么意思?


当前回答

我只想提一下伟大的AssertJ库。这是我的JUnit 4和5的go to断言库,它也优雅地解决了这个问题:

assertThat(actual).isCloseTo(expectedDouble, within(delta))

其他回答

是这两个数的差值。所以只要Math。Abs(期望-实际)<= epsilon

我只想提一下伟大的AssertJ库。这是我的JUnit 4和5的go to断言库,它也优雅地解决了这个问题:

assertThat(actual).isCloseTo(expectedDouble, within(delta))
Assert.assertTrue(Math.abs(actual-expected) == 0)

这是哪个版本的JUnit ?我只见过,没见过,但这是个次要问题!

来自JUnit javadoc:

Delta -期望和实际之间的最大Delta 数量仍然被认为是平等的。

这可能是多余的,但我通常使用一个非常小的数字,例如。

private static final double DELTA = 1e-15;

@Test
public void testDelta(){
    assertEquals(123.456, 123.456, DELTA);
}

如果使用hamcrest断言,可以只使用带有两个双精度值的标准equalTo()(它不使用delta)。然而,如果你想要一个增量,你可以使用closeTo()(参见javadoc),例如。

private static final double DELTA = 1e-15;

@Test
public void testDelta(){
    assertThat(123.456, equalTo(123.456));
    assertThat(123.456, closeTo(123.456, DELTA));
}

仅供参考,即将到来的JUnit 5也将使delta可选时调用assertEquals()与两个双精度。它的实现(如果你感兴趣的话)是:

private static boolean doublesAreEqual(double value1, double value2) {
    return Double.doubleToLongBits(value1) == Double.doubleToLongBits(value2);
}

是期望值和实际值之间的差,你可以认为它们是相等的。你可以设置。1为例。