我想測試產生用作UDP數據包發送字節數組的代碼。使用帶通配符的assertArrayEquals()?
雖然我無法重現我的測試中的每個字節(例如隨機字節,時間戳),但我想測試可以預先確定的字節。
使用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]));
}
}
}
簡單但可讀的解決方案。我爲什麼沒有想到這個?我將代碼添加到了我的問題中。 – Koraktor
也許使用'Byte []'會更合適?通配符將會是'空'。這將是少數情況下''Byte []'實際上有用的情況之一;-) –
@Joachim:使用整數也具有能夠輕鬆寫入字節文本的優勢:0xBC與(字節)0xBC –