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

Groovy 如何在Spock中断言列表只包含某些特定元素?,groovy,guava,spock,assertion,Groovy,Guava,Spock,Assertion,在pure Spock/Groovy中,我需要两个单独的断言来验证列表是否包含某些元素而不包含其他元素: def "list has single element"() { given: def list = ['x'] expect: list.size() == 1 list.first() == 'x' } 我可以通过使用番石榴依赖性来进行这一断言: expect: Iterables.getOnlyElement(list) =

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

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

    expect:
    list.size() == 1
    list.first() == 'x'
}
我可以通过使用番石榴依赖性来进行这一断言:

    expect:
    Iterables.getOnlyElement(list) == 'x'
在纯Groovy/Spock中,有没有一种方法可以在单行中实现同样的功能?我不想在考试中用太多番石榴

编辑

实际上,对于这样一个简单的例子,只要
list==['x']
就足够了。我正在寻找一种更复杂的非番石榴解决方案,在这种情况下,必须对单个元素执行多个断言:

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

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

如果创建帮助器方法是可以接受的,则可以使用
with()

其中
onlylementof()

 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
}
static T onlylementof(Iterable Iterable){
迭代器迭代器=iterable.Iterator()
def first=iterator.next()
assert!iterator.hasNext(),“Iterable有多个元素”
先返回
}

这使得测试非常可读。

如何
list==['x']
(在groovy代码中)?您可以随时将此方法添加到列表中。或者,甚至可以创建
list
接口的
SingleElemList
实现。或者编写一个包含2个资产的方法。当然,其他注释者是正确的。他们的建议很好。但我的看法是:测试应该是可读的。“expect”块中的两个条件是可读的。只要高兴就好了。为什么会有这种过早优化的冲动?
 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
}