Groovy 调用空映射上的每个映射失败

Groovy 调用空映射上的每个映射失败,groovy,spock,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.

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

@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 }
|   |
[:] [:]
我想把一张空地图当作通行证

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

但是,失败消息不那么吸引人。不是列出错误的值,而是列出整个集合。当唯一的值是“foo”和“bar”时,这并不太糟糕,但是在处理大列表时很难阅读

第二个案例,每个案例:

Condition not satisfied:

it.value != null
|  |     |
|  null  false
bar=null
第2例,每例:

Condition not satisfied:

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

有没有一种方法可以使用assert循环并将空映射视为pass?

您的测试失败是有原因的。只需检查以下表达式
[:]返回的内容。每个{it.value!=null}
返回的内容。它返回输入的空映射。在这种情况下很简单-空映射的计算结果为
false
boolean值

如果您想使用带有显式断言的
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]
    _ | [:]
}

如果您对更具声明性的内容感兴趣,并且在断言中给出了正确的错误,您也可以尝试:

[a: null, b: 2, c: 3].findAll{ it.value == null }.isEmpty()
它将所有有问题的
null
值作为映射提供给您(注意:输出来自Groovy
assert
而不是Spock):

优势取决于您的用例:

  • 你看到了所有令人不快的条目
  • 您可以看到有问题的值的所有键
[a: null, b: 2, c: 3].findAll{ it.value == null }.isEmpty()
assert([a: null, b: 2, c: 3].findAll{ it.value == null }.isEmpty())
                             |                           |
                             ['a':null]                  false

        at x.run(x.groovy:1)