【问题标题】:junit arrays not equal testjunit数组不等于测试
【发布时间】:2011-11-10 11:03:49
【问题描述】:

我正在尝试编写一个测试用例,我的场景是两个字节数组应该不等于

我可以用 junit 做到这一点吗?

或者我必须使用像 Hamcrest 这样的外部设备吗? I couldn't change the code in this answer to do the job

请提供样品。

【问题讨论】:

    标签: java arrays junit


    【解决方案1】:

    我更喜欢 Hamcrest 的方式,这种方式更具表现力:

    Assert.assertThat(array1, IsNot.not(IsEqual.equalTo(array2)));
    

    或带有静态导入的简短版本:

    assertThat(array1, not(equalTo(array2)));
    

    (幸运的是,IsEqual 匹配器足够聪明,可以理解数组。)

    请注意,Hamcrest 的受限版本是 JUnit 4.x 发行版的一部分,因此您无需添加外部库。

    【讨论】:

    • 你的意思是 Arrays.equals() 吗?
    • @Peter 是的,但无论如何我更喜欢 Hamcrest 方式。
    • 短版确实看起来更具可读性。我倾向于对性能更加疯狂......我假设 IsEquals 对数组有特殊处理并且不使用equals()
    【解决方案2】:

    你可以使用

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

    如果您想检查它们是否相等,我会改用以下内容。

    assertEquals(Arrays.toString(array1), Arrays.toString(array2));
    

    因为这会产生一个可读的输出,说明有什么不同,而不仅仅是失败。

    【讨论】:

      【解决方案3】:

      较新版本的 JUnit 提供 org.junit.Assert.assertArrayEquals(byte[], byte[]),并为其他数组类型提供重载。失败显示不匹配的第一个索引以及该索引处的不同元素。

      我也喜欢assertEquals(Arrays.asList(expected), Arrays.asList(actual))。上面提到的 Hamcrest 驱动的版本可能是最好的。

      【讨论】:

      • 问题是测试数组不等于,对吧?不使用 Hamcrest 的情况如何?有办法吗?
      【解决方案4】:

      这是一个可能的替代方案,它的优点是使用与assertArrayEquals()相同的代码:

      private void assertArrayNotEquals(byte[] expecteds, byte[] actuals) {
          try {
              assertArrayEquals(expecteds, actuals);
          } catch (AssertionError e) {
              return;
          }
          fail("The arrays are equal");
      }
      

      【讨论】:

      • 这是一个好主意,但这个答案不能按原样编译,如果它可用,如何使用并不明显。从 try-catch 中捕获并忽略 AssertionError(将其视为成功)也将捕获来自 fail 的断言错误,也将其视为成功。建议更新代码或删除此答案。
      • @Krease 你说得对,我不知道我在发帖时在想什么。我已经更正了代码。
      【解决方案5】:

      抱歉,这有点长,但很容易调试,您可以将其剪切并粘贴到您的单元测试中。

      private int span = 10;
      
      private boolean equal(byte[] expected, byte[] got) {
          final boolean result;
      
          String message = null;
          int offset = -1;
          int length = -1;
          if(expected == null && got == null) {
              result = true;
          } else if(expected == null || got == null) {
              message = "One array is null: " + (expected == null ? "expected" : "got");
              result = false;
          } else if(expected.length != got.length) {
              message = "Lengths differ: expected = " + expected.length + ", got = " + got.length;
              result = false;
          } else {
              length = expected.length;
              for(int i = 0; i < length; i++) {
                  if(expected[i] != got[i]) {
                      offset = i;
                      break;
                  }
              }
              result = offset == -1;
              if(!result) {
                  message = "Contents differ";
              }
          }
      
          if(!result) {
              System.err.println(message);
              if(offset >= 0) {
                  hexDump("Expected: ", expected, offset, length);
                  hexDump("     Got: ", got, offset, length);
              }
          }
          return result;
      }
      
      private void hexDump(String label, byte[] ba, int offset, int length) {
          System.err.print(label);
          if(ba == null) {
              System.err.println("<null>");
          } else if(ba.length == 0) {
              System.err.println("<zero-length-array>");
          } else {
              // <span> bytes either side
      
              final int from = Math.max(0, offset - span);
              final int to = Math.min(length, offset + span);
              if(from != 0) {
                  System.err.print("(offset:" + from + ") ");
              }
              for(int i = from; i < to; i++) {
                  System.err.printf("%02X ", new Byte(ba[i]));
              }
              System.err.println();
          }
      }
      
      @Test
      public void testExample() {
          assertTrue(equal(new byte[] { 1, 2, 3 }, new byte[] { 1, 8, 3 }));
      }
      

      【讨论】:

        猜你喜欢
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        • 2013-04-03
        • 2019-02-19
        • 2019-10-20
        • 2011-11-12
        相关资源
        最近更新 更多