簡體   English   中英

如何對基於HashMap值生成字符串的函數進行單元測試?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM