2013-12-20 25 views
5

Groovy generates getters and setters適用於所有類的字段。所以,當你這樣做:使用最終字段爲Groovy生成的getter調用Spock

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

你實際上是調用生成的方法Foo.getBar()

我有喜歡檢查這些生成的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中讀取?它工作,如果我省略final,但這是一個蹩腳的解決方案...

回答

8

對於final屬性,Groovy生成一個final getter方法。但是,使用Mock(),Stub()Spy()創建的測試雙打純粹是基於代理的,因此無法攔截最終方法。

由於您的測試代碼是使用Groovy編寫的,因此您可以使用GroovyMock()來解決該問題。

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

PPS:如果您有具體原因(嘲笑最終方法,嘲諷動態方法等),只需要更喜歡GroovyMock()而不是Mock()。有關詳細信息,請參閱reference documentation

+0

完美答案 - 謝謝 –

相關問題