如何在Spock中断言该列表仅包含某些特定元素?

时间:2019-04-30 11:11:34

标签: groovy guava spock assertion

在纯粹的Spock / Groovy中,我需要两个单独的断言来验证列表是否包含某些元素而没有其他内容:

def "list has single element"() {
    given:
    def list = ['x']

    expect:
    list.size() == 1
    list.first() == 'x'
}

我可以使用Guava依赖项使该断言单行显示:

    expect:
    Iterables.getOnlyElement(list) == 'x'

在纯Groovy / Spock中是否可以在单行中执行相同的操作?我不想在测试中过多使用番石榴。

编辑

实际上,对于这样一个简单的示例,只需list == ['x']就足够了。当必须在单个元素上执行多个断言时,我正在寻找一种非Guava解决方案来解决更复杂的问题:

  def "list has single element"() {
        given:
        def list = [5.0]

        expect:
        def bigDecimal = Iterables.getOnlyElement(list)
        bigDecimal.scale() == 1
        bigDecimal.precision() == 2
    }

1 个答案:

答案 0 :(得分:1)

如果可以创建一个辅助方法,则可以使用with()

def "list has single element"() {
    given:
    def list = [5.0]

    expect:
    with onlyElementOf(list), {
        it.scale() == 1
        it.precision() == 2
    }
}

onlyElementOf()在哪里

 static <T> T onlyElementOf(Iterable<T> iterable) {
    Iterator iterator = iterable.iterator()
    def first = iterator.next()
    assert !iterator.hasNext(), "Iterable has more than 1 element"
    return first
}

这使测试更具可读性。