JUnit测试用例失败

时间:2013-07-19 21:01:16

标签: java junit

这是我创建的立方根方法的测试用例的JUnit代码,它实现了Newton的方法:

@Test
public void standardCase_negative64e9() {
  double n = -64E9;
  double result = csc143.newton.Roots.cbrt(n);
  double delta = n * 1E-8;
  assertEquals("Standard cube root -64E9", -4.0E3, result, delta);
}

当我对所有测试用例进行测试时(使用DrJave IDE),我只对这个测试用例失败了,它显示为:

Failure: java.lang.AssertionError: Standard cube root -64E9 expected:<-4000.0> but
was:<-4000.0000000003124>

我觉得这与我的“delta”值(在这种情况下为-640)有关,因为当我用640(而不是-640)替换“delta”时在assertEquals()方法中,我没有失败......

2 个答案:

答案 0 :(得分:3)

您的delta具有此值:-64E9*1E-8实际上是-64。即:它是负值。由于delta预计是实际值和期望值之间差异的上限,因此需要将其设为正数。

查看Assert课程的source code。比较双打的地方是doubleIsDifferent方法:

static private boolean doubleIsDifferent(double d1, double d2, double delta) {
    if (Double.compare(d1, d2) == 0) {
        return false;
    }
    if ((Math.abs(d1 - d2) <= delta)) {    
        return false;
    }

    return true;
}

如您所见,相关表达式为Math.abs(d1 - d2) <= delta。因为它使用Math.abs,所以左侧始终为0或正数。因此,它永远不会小于负值,因此此方法始终返回true,从而向调用者(assertEquals)指示您的值不同。

换句话说:将delta的定义更改为:

double delta = Math.abs(n * 1E-8);

答案 1 :(得分:1)

如果您阅读Javadocs of JUnit Assert, assertEquals,您会发现delta确实应该是肯定的:

  

断言两个双精度或浮点数等于正三角形。