如何使用Spock框架强制校验Map的顺序一致性
解决Groovy中Map顺序不影响相等性的测试问题
你遇到的问题其实是Groovy中Map的==运算符特性导致的:虽然Groovy默认使用LinkedHashMap(确实会保留插入顺序),但==比较的是键值对的内容是否完全一致,完全不关心它们的顺序。所以哪怕两个Map的键值对顺序不同,只要所有键和对应的值都匹配,a == b就会返回true,这就是你的测试意外通过的原因。
要让测试能检测到Map的顺序差异,你可以直接比较两个Map的entrySet()——因为LinkedHashMap的entrySet会严格保留插入顺序,顺序不同时entrySet()的比较就会失败。修改后的测试代码如下:
def "test foo"() { given: def a = [a: 1, c: 3, b: 2] when: def b = [a: 1, b: 2, c: 3] then: a.entrySet() == b.entrySet() }
这样运行测试就会按照你的期望失败,因为两个Map的entry顺序不一致。
另外,如果你的业务场景只需要验证键的顺序,也可以用a.keySet() == b.keySet(),但用entrySet()会更严谨,能同时验证键和值的顺序与内容。
内容的提问来源于stack exchange,提问作者KIC
相关产品推荐
相关产品推荐

