junit数组不等于测试

6tr1vspr  于 2022-11-11  发布在  其他
关注(0)|答案(6)|浏览(228)

我尝试写一个测试用例,我的场景是两个字节数组应该不相等
我可以用junit来做这件事吗?
或者我必须使用外部代码,如Hamcrest?我无法更改此答案中的代码来完成这项工作
请给予样品。

wvyml7n5

wvyml7n51#

您可以使用

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

如果你想检查它们是否相等,我会使用下面的代码。

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

因为这产生关于什么是不同的而不仅仅是失败的可读输出。

w8rqjzmb

w8rqjzmb2#

我更喜欢Hamcrest的方式,它更有表现力:

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

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

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

(The幸运的是,IsEqual matcher足够聪明,能够理解数组。)
请注意,Hamcrest的有限版本是JUnit 4.x发行版的一部分,因此您不需要添加外部库。

hs1rzwqc

hs1rzwqc3#

新版本的JUnit提供org.junit.Assert.assertArrayEquals(byte[], byte[]),并为其他数组类型提供重载。失败显示第一个索引不匹配,以及该索引处的不同元素。
我也喜欢assertEquals(Arrays.asList(expected), Arrays.asList(actual))。上面提到的Hamcrest驱动的再现可能是最好的。

klsxnrf1

klsxnrf14#

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

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

j8yoct9x5#

您可以这样做:

assertNotEquals(arrayOne, arrayTwo)
ctehm74n

ctehm74n6#

对不起,这是有点长,但它很容易调试,你可以剪切和粘贴到您的单元测试。

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 }));
}

相关问题