所有课程字段的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
,它就有效,但这是一个糟糕的解决方案......
答案 0 :(得分:8)
对于final
属性,Groovy会生成final
getter方法。但是,使用Mock()
,Stub()
或Spy()
创建的测试双打纯粹是基于代理的,因此无法拦截最终方法。
由于您的测试代码是用Groovy编写的,因此您可以使用GroovyMock()
来解决问题。
PS:1 * foo.getBar()
和1 * foo.bar
都是有效的注释。
PPS:如果您有具体原因(模拟最终方法,模拟动态方法等),则只需GroovyMock()
而不是Mock()
。有关详细信息,请参阅reference documentation。