我尝试写一个测试用例,我的场景是两个字节数组应该不相等。我可以用junit来做这件事吗?或者我必须使用外部代码,如Hamcrest?我无法更改此答案中的代码来完成这项工作请给予样品。
wvyml7n51#
您可以使用
assertFalse(Arrays.equals(array1, array2));
如果你想检查它们是否相等,我会使用下面的代码。
assertEquals(Arrays.toString(array1), Arrays.toString(array2));
因为这产生关于什么是不同的而不仅仅是失败的可读输出。
w8rqjzmb2#
我更喜欢Hamcrest的方式,它更有表现力:
Assert.assertThat(array1, IsNot.not(IsEqual.equalTo(array2)));
或者是带有静态导入的简短版本:
assertThat(array1, not(equalTo(array2)));
(The幸运的是,IsEqual matcher足够聪明,能够理解数组。)请注意,Hamcrest的有限版本是JUnit 4.x发行版的一部分,因此您不需要添加外部库。
IsEqual
hs1rzwqc3#
新版本的JUnit提供org.junit.Assert.assertArrayEquals(byte[], byte[]),并为其他数组类型提供重载。失败显示第一个索引不匹配,以及该索引处的不同元素。我也喜欢assertEquals(Arrays.asList(expected), Arrays.asList(actual))。上面提到的Hamcrest驱动的再现可能是最好的。
org.junit.Assert.assertArrayEquals(byte[], byte[])
assertEquals(Arrays.asList(expected), Arrays.asList(actual))
klsxnrf14#
下面是一个可能的替代方法,它的优点是使用与assertArrayEquals()相同的代码:
assertArrayEquals()
private void assertArrayNotEquals(byte[] expecteds, byte[] actuals) { try { assertArrayEquals(expecteds, actuals); } catch (AssertionError e) { return; } fail("The arrays are equal"); }
j8yoct9x5#
您可以这样做:
assertNotEquals(arrayOne, arrayTwo)
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 })); }
6条答案
按热度按时间wvyml7n51#
您可以使用
如果你想检查它们是否相等,我会使用下面的代码。
因为这产生关于什么是不同的而不仅仅是失败的可读输出。
w8rqjzmb2#
我更喜欢Hamcrest的方式,它更有表现力:
或者是带有静态导入的简短版本:
(The幸运的是,
IsEqual
matcher足够聪明,能够理解数组。)请注意,Hamcrest的有限版本是JUnit 4.x发行版的一部分,因此您不需要添加外部库。
hs1rzwqc3#
新版本的JUnit提供
org.junit.Assert.assertArrayEquals(byte[], byte[])
,并为其他数组类型提供重载。失败显示第一个索引不匹配,以及该索引处的不同元素。我也喜欢
assertEquals(Arrays.asList(expected), Arrays.asList(actual))
。上面提到的Hamcrest驱动的再现可能是最好的。klsxnrf14#
下面是一个可能的替代方法,它的优点是使用与
assertArrayEquals()
相同的代码:j8yoct9x5#
您可以这样做:
ctehm74n6#
对不起,这是有点长,但它很容易调试,你可以剪切和粘贴到您的单元测试。