Spov使用final字段调用Groovy生成的getter

时间:2013-12-20 10:55:32

标签: groovy getter-setter spock

所有课程字段的Groovy generates getters and setters。所以当你这样做时:

class Foo {
    final bar
}
new Foo().bar

您实际上正在调用生成的方法Foo.getBar()

我有一个Spock规范,它喜欢检查这种生成的getter的调用:

def "some spock test"() {
    given: def fooMock = Mock(Foo)
    when:  someFunction(fooMock)
    then:  1 * fooMock.getBar()
}

someFunction()执行fooMock.bar,但我总是

Too few invocations for:
1 * fooMock.getBar()   (0 invocations)

1 * fooMock.bar也不起作用。如何检查在测试中从bar读取Foo?如果我省略final,它就有效,但这是一个糟糕的解决方案......

1 个答案:

答案 0 :(得分:8)

对于final属性,Groovy会生成final getter方法。但是,使用Mock()Stub()Spy()创建的测试双打纯粹是基于代理的,因此无法拦截最终方法。

由于您的测试代码是用Groovy编写的,因此您可以使用GroovyMock()来解决问题。

PS:1 * foo.getBar()1 * foo.bar都是有效的注释。

PPS:如果您有具体原因(模拟最终方法,模拟动态方法等),则只需GroovyMock()而不是Mock()。有关详细信息,请参阅reference documentation