2015-08-19 87 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

相关问题