如何使用spock框架强制执行相同订单的映射

时间:2018-04-02 14:49:59

标签: groovy spock

以下测试通过,而我实际上希望看到它失败。该命令对我的用例很重要。但是我认为groovy总是使用链表,所以排序应该是可测试的。

def "test foo"() {
    given:
    def a = [a: 1, c: 3, b: 2]

    when:
    def b = [a: 1, b: 2, c: 3]

    then:
    a == b
}

2 个答案:

答案 0 :(得分:2)

如果要在这两个LinkedHashMap实例中测试密钥的顺序,可以执行以下操作:

def "test foo"() {
    given:
    def a = [a: 1, c: 3, b: 2]

    when:
    def b = [a: 1, b: 2, c: 3]

    then: "make sure maps are equal"
    a == b

    and: "make sure entries are defined in the same order"
    a.collect { it.key } == b.collect { it.key }
}

LinkedHashMap不会覆盖equals方法(它使用AbstractMap类中定义的方法,例如HashMap使用的方法),它只定义了迭代(条目添加到地图的顺序)。

两个断言都可以简化为单个:

def "test foo"() {
    given:
    def a = [a: 1, c: 3, b: 2]

    when:
    def b = [a: 1, b: 2, c: 3]

    then: "compare ordered list of map entries"
    a.collect { it } == b.collect { it }
}

答案 1 :(得分:-1)

您可以在比较中使用toMapString()

a.toMapString() == b.toMapString()

toMapString将地图转换为字符串,这意味着订单将影响比较

'[a:1, c:3, b:2]' == '[a:1, b:2, c:3]'

将返回false。