我正在尝试对一个函数进行单元测试,该函数采用hashmap并将键连接成逗号分隔的字符串。问题是,当我使用entryset(或keyset或valueset)遍历hashmap时,值的顺序与i.put()不同。即:
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);
}
2条答案
按热度按时间kr98yfug1#
迭代整个过程是没有意义的
HashMap
在这种情况下。迭代它的唯一原因是构造预期的String
换句话说,执行与被测方法相同的操作,因此如果实现该方法时出错,则在为单元测试实现相同操作时很可能会重复该错误,从而无法发现错误。你应该关注输出的有效性。测试它的一种方法是将其拆分为键,并检查它们是否与源Map的键匹配:
您可以控制测试数据,因此可以确保
", "
出现在键字符串中。请注意,在当前形式中,问题的方法将失败,因为结果
String
有一个额外的前导空间。你必须决定它是否是有意的(在这种情况下,你必须将测试改为assertEquals(testData.keySet(), new HashSet<>(Arrays.asList(result.substring(1) .split(", "))));
)或者一个斑点bug(然后,您必须将方法的最后一行更改为return str.substring(2);
).别忘了为空Map创建一个测试用例…
lnlaulya2#
hashmap不维护插入顺序….如果要维护插入顺序,请使用linkedhashmap