【问题标题】:Junit assert double arraysJunit 断言双数组
【发布时间】:2016-06-04 06:54:21
【问题描述】:

如何断言doubles 的两个数组包含相同的元素。有一些方法可以断言整数数组和其他原始类型包含相同的元素,但不适用于doubles。

【问题讨论】:

    标签: java junit


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      如果您使用的不是支持双数组比较的 JUnit 版本,那么最简单的解决方案是使用 Arrays.equals

      assertTrue(Arrays.equals(array1, array2));
      

      但是,这不会像 Junit 双断言那样处理舍入错误。

      【讨论】:

        【解决方案3】:

        通常,您将双精度数与舍入误差的容差进行比较。使用 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 更好,因为您可以逐个元素地可视化测试结果:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-22
          • 1970-01-01
          • 1970-01-01
          • 2018-12-23
          • 2011-11-12
          • 2023-03-15
          • 2015-01-10
          • 1970-01-01
          相关资源
          最近更新 更多