2011-10-25 28 views
3

我想測試產生用作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])); 
     } 
    } 
} 

回答

2

您可以簡單地將您期望的數組寫成整數數組,然後使用特殊值(例如-1)來表示通配符。這與輸入流的讀取方法相同。你只需要寫你的自定義assertEqualsWithWildCard(int[] expected, byte[] actual)

+0

簡單但可讀的解決方案。我爲什麼沒有想到這個?我將代碼添加到了我的問題中。 – Koraktor

+1

也許使用'Byte []'會更合適?通配符將會是'空'。這將是少數情況下''Byte []'實際上有用的情況之一;-) –

+0

@Joachim:使用整數也具有能夠輕鬆寫入字節文本的優勢:0xBC與(字節)0xBC –

1

如果你將要編寫大量的代碼,這樣,我就編寫一個單獨的類來將數據包「解碼」爲有意義的字段。然後,(當然,測試的類本身的工作之後)你可以寫明智的測試,如

assertEquals(42, packet.length()); 
assertEquals(0xDEADBEEF, packet.checksum()); 

這樣的話,你是不是「忽略隨機字節」,而你的代碼將大大更可讀(如果稍微詳細些)。

+0

聽起來不錯,但似乎有點太多,因爲沒有那麼多的數據包要測試。 – Koraktor