我想测试生成用于作为UDP数据包发送的字节数组的代码。
虽然我不能在我的测试中重现每个字节(例如随机字节,时间戳),但我想测试我可以预先确定的字节。
使用JUnit 4.8(和Mockito 1.8)是否可能实现以下内容?
Packet packet = new RandomPacket();
byte[] bytes = new byte[] {
0x00, 0x02, 0x05, 0x00, anyByte(), anyByte(), anyByte(), anyByte(), 0x00
};
assertArrayEquals(packet.getBytes(), bytes);
上面的示例当然不起作用,我只是在寻找一种在assertArrayEquals()
中使用某种通配符的方法。
PS:我现在唯一的选择是单独检查每个字节(并省略随机的)。但是,这是相当乏味的,并不是真正可重用的。
感谢JB Nizet的回答,我现在有了下面的代码,工作得很好:
private static int any() {
return -1;
}
private static void assertArrayEquals(int[] expected, byte[] actual) {
if(actual.length != expected.length) {
fail(String.format("Arrays differ in size: expected <%d> but was <%d>", expected.length, actual.length));
}
for(int i = 0; i < expected.length; i ++) {
if(expected[i] == -1) {
continue;
}
if((byte) expected[i] != actual[i]) {
fail(String.format("Arrays differ at element %d: expected <%d> but was <%d>", i, expected[i], actual[i]));
}
}
}
您可以简单地将期望的数组写成整数数组,并使用一个特殊值(例如-1)来表示通配符。这与输入流的read方法的技巧相同。您只需要编写您的自定义assertEqualsWithWildCard(int[] expected, byte[] actual)
。
如果您要编写大量这样的代码,我会编写一个单独的类来将数据包"解码"为有意义的字段。然后(当然,在测试类本身工作之后),您可以编写像
这样的合理测试assertEquals(42, packet.length());
assertEquals(0xDEADBEEF, packet.checksum());
等。
这样,您就不会"省略随机字节",并且您的代码将更具可读性(如果有点冗长)。