【发布时间】:2016-06-04 06:54:21
【问题描述】:
如何断言doubles 的两个数组包含相同的元素。有一些方法可以断言整数数组和其他原始类型包含相同的元素,但不适用于doubles。
【问题讨论】:
如何断言doubles 的两个数组包含相同的元素。有一些方法可以断言整数数组和其他原始类型包含相同的元素,但不适用于doubles。
【问题讨论】:
JUnit 4.12 有(实际上它已经是 4.6 的一部分,github 上最旧的版本)
org.junit.Assert.assertArrayEquals(double[] expecteds, double[] actuals, double delta)
org.junit.Assert.assertArrayEquals(String message, ddouble[] expecteds, double[] actuals, double delta)
参见https://github.com/junit-team/junit4/blob/r4.12/src/main/java/org/junit/Assert.java,源代码行 482 和 498
【讨论】:
如果您使用的不是支持双数组比较的 JUnit 版本,那么最简单的解决方案是使用 Arrays.equals:
assertTrue(Arrays.equals(array1, array2));
但是,这不会像 Junit 双断言那样处理舍入错误。
【讨论】:
通常,您将双精度数与舍入误差的容差进行比较。使用 Java 8 和 JUnit 5 解决这个问题:
public static final double TOLERANCE = 1e-9;
@ParameterizedTest
@MethodSource("getValues")
public void testArrayOfDoublesEquals(double a, double b)
{
assertEquals(a, b, TOLERANCE);
}
private static Stream<Arguments> getValues() {
double[] arrayA = new double[] {1.0, 2.097, 3.98000000001};
double[] arrayB = new double[] {1.0, 2.097, 3.98000000000};
List<Arguments> args = new ArrayList<>();
for(int i = 0; i < arrayA.length; i++) {
args.add(Arguments.of(arrayA[i], arrayB[i]));
}
return args.stream();
}
比 assertArrayEquals 更好,因为您可以逐个元素地可视化测试结果:
【讨论】: