java—如何对基于hashmap值生成字符串的函数进行单元测试?

t40tm48m  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(279)

我正在尝试对一个函数进行单元测试,该函数采用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);
}
kr98yfug

kr98yfug1#

迭代整个过程是没有意义的 HashMap 在这种情况下。迭代它的唯一原因是构造预期的 String 换句话说,执行与被测方法相同的操作,因此如果实现该方法时出错,则在为单元测试实现相同操作时很可能会重复该错误,从而无法发现错误。
你应该关注输出的有效性。测试它的一种方法是将其拆分为键,并检查它们是否与源Map的键匹配:

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); ).
别忘了为空Map创建一个测试用例…

lnlaulya

lnlaulya2#

hashmap不维护插入顺序….如果要维护插入顺序,请使用linkedhashmap

相关问题