我正在使用Junit在调用方法后声明我收到的预期和实际HashMaps之间的相等性。代码如下所示:
Assert.assertEquals(expectedKlassToScore, klassToScore);
此处expectedKlassToScore
和klassToScore
属于Map<MyObject, Double>
类型。 HashMap中的某些值在小数点后长达16位。我假设根据这些测试运行的机器,最后几个小数位可能是不准确的 - 由于硬件上如何实现分数的性质。
如何修改断言语句以启用准确性窗口以让测试在不同的计算机上通过?
答案 0 :(得分:3)
public static void assertEqualsMapEpsilon(Map<Object,Double> expected, Map<Object,Double> actual, double epsilon) {
assertEquals(expected.size(), actual.size());
for(Map.Entry<Object,Double> value:expected.entrySet()){
Double actualValue = actual.get(value.getKey());
assertNotNull(actualValue);
assertEquals(value.getValue(), actualValue, epsilon);
}
}
答案 1 :(得分:0)
您应该使用BigDecimal
。 Double
总是不准确。
答案 2 :(得分:0)
如您所见{8},Assert.assertEquals使用equals()方法检查对象是否相等。我想说最简单的方法是创建一个实现Map&lt;&gt;的类。并覆盖equals方法。
答案 3 :(得分:-2)
HashMap中的某些值在小数点后长达16位。
错误。 {em>无 HashMap
中的双精度值在小数点后长达16位。双精度浮点数最多为15.9个有效十进制数字。其他任何东西都是幻觉。
我假设根据机器运行这些测试,最后几个小数位可能不准确 - 由于硬件上如何实现分数的性质。
再次错了。 Java中所有基本类型的格式和范围都是与硬件无关的。
如何修改断言语句以启用准确性窗口以让测试在不同的计算机上通过?
测试 epsilon 值内的相等性。