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

Fra*_*ois 5 groovy getter-setter spock

Groovy 为您所有类的字段生成getter和setter.所以当你这样做时:

class Foo {
    final bar
}
new Foo().bar
Run Code Online (Sandbox Code Playgroud)

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

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

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

someFunction()fooMock.bar,但我总是

Too few invocations for:
1 * fooMock.getBar()   (0 invocations)
Run Code Online (Sandbox Code Playgroud)

1 * fooMock.bar也行不通.如何检查测试中是否bar已读取Foo?如果我省略final,它可以工作,但这是一个糟糕的解决方案......

Pet*_*ser 8

对于final属性,Groovy生成一个finalgetter方法.但是,使用Mock(),Stub()Spy()纯粹基于代理创建的测试双精度,因此无法拦截最终方法.

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

PS:两个1 * foo.getBar()1 * foo.bar有效符号.

PPS:只有喜欢GroovyMock()Mock(),如果你有一个具体的理由(嘲讽的最终方法,嘲讽动态方法等).有关详细信息,请参阅参考文档.