在空地图上调用每个失败

时间:2019-03-20 16:35:47

标签: groovy spock

在以下代码中,最后一个测试失败:

@Unroll
def "each #map"(Map map) {
    expect:
    map.each{ assert it.value != null }

    where:
    _ | map
    _ | [foo: 1, bar: 1]
    _ | [foo: 1, bar: null]
    _ | [:]
}

..显示以下消息:

Condition not satisfied:

map.each{ assert it.value != null }
|   |
[:] [:]

我想将一张空地图当作通行证。

我知道我可以使用“每个”。即

@Unroll
def "every #map"(Map map) {
    expect:
    map.every{ it.value != null }

    where:
    _ | map
    _ | [foo: 1, bar: 1]
    _ | [foo: 1, bar: null]
    _ | [:]
}

但是,失败消息的吸引力较小。而不是列出错误的值,而是列出整个集合。当唯一的值是“ foo”和“ bar”时,这还不错,但是在处理大型列表时很难读取。

每种情况的第二种情况:

Condition not satisfied:

it.value != null
|  |     |
|  null  false
bar=null

第二种情况:

Condition not satisfied:

map.every{ it.value != null }
|   |
|   false
[foo:1, bar:null]

有没有一种方法可以使用assert循环,同时将空映射视为通过?

2 个答案:

答案 0 :(得分:4)

如果您对看起来更具声明性的东西感兴趣,并在断言中给您适当的错误,也可以尝试:

[a: null, b: 2, c: 3].findAll{ it.value == null }.isEmpty()

将所有令人反感的null值作为地图提供给您(注意:输出来自Groovy assert而不是Spock):

assert([a: null, b: 2, c: 3].findAll{ it.value == null }.isEmpty())
                             |                           |
                             ['a':null]                  false

        at x.run(x.groovy:1)

根据您的用例的优势:

  • 您会看到所有令人反感的条目
  • 您会看到所有的违规值

答案 1 :(得分:3)

您的测试失败有充分的理由。只需检查以下表达式[:].each { it.value != null }返回什么。它返回输入的空映射。在这种情况下,Groovy Truth很简单-一个空映射的值为false布尔值。

如果要对显式断言使用map.each {},则可以在条件中添加一个小的“例外”-您可以明确期望空映射有效,对于所有其余情况,请检查其中的所有值非空地图。

@Unroll
def "each #map"(Map map) {
    expect:
    map == [:] || map.each { assert it.value != null }

    where:
    _ | map
    _ | [foo: 1, bar: 1]
    _ | [foo: 1, bar: null]
    _ | [:]
}