![](/img/trans.png)
[英]JAVA: HashMap<String, ArrayList> - How can I associate the values?
[英]How can I unit test a function that makes a string based on HashMap values?
我正在嘗試對采用HashMap並將鍵連接成逗號分隔的字符串的函數進行單元測試。 問題是,當我使用entrySet(或keySet或valueSet)遍歷HashMap時,值不是按..put()它們的順序排列。IE:
testData = new HashMap<String, String>(0);
testData.put("colA", "valA");
testData.put("colB", "valB");
testData.put("colC", "valC");
for (Map.Entry<String, String> entry : testData.entrySet()) {
System.out.println("TestMapping " + entry.getKey());
}
給我以下輸出:
TestMapping colB
TestMapping colC
TestMapping colA
SUT創建的字符串是ColB,ColC,ColA
由於keySet(),valueSet()等在其順序上有些武斷,因此如何進行單元測試?
這是我要測試的功能:
public String getColumns() {
String str = "";
for (String key : data.keySet()) {
str += ", " + key;
}
return str.substring(1);
}
在這種情況下,沒有必要遍歷HashMap
。 對其進行迭代的唯一原因是構造預期的String
,換句話說,執行與被測方法相同的操作,因此,如果在實現該方法時出錯,則在實現相同的方法時可能會重復該錯誤。對於單元測試,無法發現錯誤。
您應該關注輸出的有效性。 一種測試方法是將其拆分為鍵,然后檢查它們是否與源映射的鍵匹配:
testData = new HashMap<>();
testData.put("colA", "valA");
testData.put("colB", "valB");
testData.put("colC", "valC");
String result = getColumn();
assertEquals(testData.keySet(), new HashSet<>(Arrays.asList(result.split(", "))));
您可以控制測試數據,因此可以確保鍵字符串中沒有出現", "
。
請注意,以當前形式,您問題的方法將失敗,因為結果String
具有額外的前導空格。 您必須確定它是否是有意的(在這種情況下,必須將測試更改為assertEquals(testData.keySet(), new HashSet<>(Arrays.asList(result.substring(1) .split(", "))));
)或發現的bug(然后,您必須更改方法的最后一行以return str.substring(2);
)。
不要忘記為一個空的地圖做一個測試用例…
HashMap不維護插入順序。...如果要保持插入順序,請使用linkedhashmap
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.