如果使用"as"定义,则斯波克交互作用不起作用



我写了以下规范:

class Spec extends Specification {
    def 'does not work if interaction declared as Set without parens'() {
        given:
        def holder = Mock(Holder)
        def expected = [1, 2, 3, 3]
        when:
        def output = holder.value()
        then:
        output == [1, 2, 3] as Set
//        1 * holder.value() >> expected.toSet()      // 1
        1 * holder.value() >> expected as Set       // 2
//        1 * holder.value() >> (expected as Set)     // 3
    }
    class Holder {
        def value() {
        }
    }
}

问题在于,仅当交互定义为第 1 行或第 3 行时holder.value()它才有效。当它像在第 2 行中一样定义时,它会失败并显示以下错误:

Condition not satisfied:
output == [1, 2, 3] as Set
|      |
null   false

为什么?似乎可能存在一些解析器错误。

没有解析器错误,但您犯了编程错误。根据 Groovy 运算符优先级的规则>>具有比 as 更高的优先级,这有效地使您的错误代码等同于

((1 * holder.value()) >> expected) as Set

Spock实现了DSL进行测试,但代码仍然是Groovy。

最新更新