Groovy的Spock调用&x27;s使用最后一个字段生成getter

Groovy的Spock调用&x27;s使用最后一个字段生成getter,groovy,getter-setter,spock,Groovy,Getter Setter,Spock,Groovy用于所有类的字段。所以当你这样做的时候: 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.getBa

Groovy用于所有类的字段。所以当你这样做的时候:

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
也不起作用。如何检查测试中是否从
Foo
读取了
bar
?如果我省略了
final
,它会工作,但这是一个糟糕的解决方案…

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

因为您的测试代码是用Groovy编写的,所以您可以使用
GroovyMock()
,这就解决了问题

注:
1*foo.getBar()
1*foo.bar
都是有效的符号

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