【发布时间】:2011-11-10 11:03:49
【问题描述】:
我正在尝试编写一个测试用例,我的场景是两个字节数组应该不等于。
我可以用 junit 做到这一点吗?
或者我必须使用像 Hamcrest 这样的外部设备吗? I couldn't change the code in this answer to do the job
请提供样品。
【问题讨论】:
我正在尝试编写一个测试用例,我的场景是两个字节数组应该不等于。
我可以用 junit 做到这一点吗?
或者我必须使用像 Hamcrest 这样的外部设备吗? I couldn't change the code in this answer to do the job
请提供样品。
【问题讨论】:
我更喜欢 Hamcrest 的方式,这种方式更具表现力:
Assert.assertThat(array1, IsNot.not(IsEqual.equalTo(array2)));
或带有静态导入的简短版本:
assertThat(array1, not(equalTo(array2)));
(幸运的是,IsEqual 匹配器足够聪明,可以理解数组。)
请注意,Hamcrest 的受限版本是 JUnit 4.x 发行版的一部分,因此您无需添加外部库。
【讨论】:
equals()
你可以使用
assertFalse(Arrays.equals(array1, array2));
如果您想检查它们是否相等,我会改用以下内容。
assertEquals(Arrays.toString(array1), Arrays.toString(array2));
因为这会产生一个可读的输出,说明有什么不同,而不仅仅是失败。
【讨论】:
较新版本的 JUnit 提供 org.junit.Assert.assertArrayEquals(byte[], byte[]),并为其他数组类型提供重载。失败显示不匹配的第一个索引以及该索引处的不同元素。
我也喜欢assertEquals(Arrays.asList(expected), Arrays.asList(actual))。上面提到的 Hamcrest 驱动的版本可能是最好的。
【讨论】:
这是一个可能的替代方案,它的优点是使用与assertArrayEquals()相同的代码:
private void assertArrayNotEquals(byte[] expecteds, byte[] actuals) {
try {
assertArrayEquals(expecteds, actuals);
} catch (AssertionError e) {
return;
}
fail("The arrays are equal");
}
【讨论】:
AssertionError(将其视为成功)也将捕获来自 fail 的断言错误,也将其视为成功。建议更新代码或删除此答案。
抱歉,这有点长,但很容易调试,您可以将其剪切并粘贴到您的单元测试中。
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 }));
}
【讨论】: