我有一个关于JUnit assertEquals测试双值的问题。阅读API文档,我可以看到:
@Deprecated 公共静态无效assertEquals(double expected, double actual) 弃用。使用assertEquals(double expected, double actual, double delta)代替。
(注意:在较旧的文档版本中,delta参数称为epsilon)
(或)参数是什么意思?
我有一个关于JUnit assertEquals测试双值的问题。阅读API文档,我可以看到:
@Deprecated 公共静态无效assertEquals(double expected, double actual) 弃用。使用assertEquals(double expected, double actual, double delta)代替。
(注意:在较旧的文档版本中,delta参数称为epsilon)
(或)参数是什么意思?
当前回答
是期望值和实际值之间的差,你可以认为它们是相等的。你可以设置。1为例。
其他回答
是这两个数的差值。所以只要Math。Abs(期望-实际)<= epsilon
问题是,由于浮点数固有的精度问题,两个double可能不完全相等。有了这个增量值,您就可以根据误差因子控制等式的计算。
此外,一些浮点值可能具有特殊的值,如NAN和-Infinity/+Infinity,这可能会影响结果。
如果你真的想比较两个双精度对象是否完全相等,那么最好将它们作为一个长表示进行比较
Assert.assertEquals(Double.doubleToLongBits(expected), Double.doubleToLongBits(result));
Or
Assert.assertEquals(0, Double.compareTo(expected, result));
可以考虑到这些细微差别。
我还没有深入研究Assert方法,但我只能假设以前的方法已经不适合这种问题,而新的方法确实考虑到了这些问题。
Assert.assertTrue(Math.abs(actual-expected) == 0)
我只想提一下伟大的AssertJ库。这是我的JUnit 4和5的go to断言库,它也优雅地解决了这个问题:
assertThat(actual).isCloseTo(expectedDouble, within(delta))
请注意,如果您不做数学运算,那么断言精确的浮点值也没有错。例如:
public interface Foo {
double getDefaultValue();
}
public class FooImpl implements Foo {
public double getDefaultValue() { return Double.MIN_VALUE; }
}
在这种情况下,你要确保它真的是MIN_VALUE,而不是0或-MIN_VALUE或MIN_NORMAL或其他一些非常小的值。你可以说
double defaultValue = new FooImpl().getDefaultValue();
assertEquals(Double.MIN_VALUE, defaultValue);
但是这会给你一个弃用警告。为了避免这种情况,你可以调用assertEquals(Object, Object):
// really you just need one cast because of autoboxing, but let's be clear
assertEquals((Object)Double.MIN_VALUE, (Object)defaultValue);
如果你真的想看起来聪明:
assertEquals(
Double.doubleToLongBits(Double.MIN_VALUE),
Double.doubleToLongBits(defaultValue)
);
或者你可以使用Hamcrest流畅风格的断言:
// equivalent to assertEquals((Object)Double.MIN_VALUE, (Object)defaultValue);
assertThat(defaultValue, is(Double.MIN_VALUE));
如果你要检查的值确实来自于一些数学运算,那么就用。