2015-08-19 86 views
0

我正在嘗試爲調用服務方法的控制器編寫測試。我想嘲笑該服務中的依賴方法。如何在Grails集成測試中部分模擬服務

我的規格如下:

MyController myController = new MyController() 
def mockMyService 

def "My spy should be called"() { 
    when: 
     mockMyService = Spy(MyService) { 
      methodToSpy() >> { 
       println "methodToSpy called" 
      } // stub out content of this fn 
     } 
     myController.myService = mockMyService 
     myController.callService() 

    then: 
     1 * mockMyService.methodToSpy() 
} 

當我嘗試運行這個測試,我得到以下錯誤:

 
Failure: | 
My spy should be called(spybug.MyControllerSpec) 
| 
Too few invocations for: 
1 * mockMyService.methodToSpy() (0 invocations) 
Unmatched invocations (ordered by similarity): 
1 * mockMyService.serviceMethod() 
1 * mockMyService.invokeMethod('methodToSpy', []) 
1 * mockMyService.invokeMethod('println', ['in serviceMethod about to call methodToSpy']) 
1 * mockMyService.invokeMethod('println', ['Back from methodToSpy']) 

正如你所看到的,斯波克被捕獲的Groovy invokeMethod中調用,而不是隨後調用實際方法。這是爲什麼發生?

完整的項目可用here

+0

您正在編寫單元或集成測試嗎? –

回答

0

試試這個:

def "My spy should be called"() { 
    given: 
    mockMyService = Mock(MyService) 
    myController.myService = mockMyService 

    when: 
    myController.callService() 

    then: 
    1 * mockMyService.methodToSpy(_) >> { println "methodToSpy called" } 
} 

據爲存根斯波克文檔,如果你想使用的基數,則必須使用模擬,而不是存根。

http://spockframework.github.io/spock/docs/1.0/interaction_based_testing.html#_stubbing

+0

不,我想確保MyService.callService調用methodToSpy。嘲笑整個服務只允許我確認callService()被調用,而不是callService調用methodToSpy() – mmigdol

+0

對不起,我完全誤解了! –

+0

沒問題。 FWIW,我認識到[Spock Interactions文檔](http://spockframework.github.io/spock/docs/1.0/interaction_based_testing.html)中的警告,指出'(在使用此功能之前請仔細考慮它。更好地改變規範下代碼的設計。)'但是我認爲partials在某些情況下仍然有用,並且希望得到這個工作... – mmigdol

相關問題