2012-11-27 71 views
2

我以为我已经理解了Spock交互,但是我必须要管理员,我仍然缺少一些图片。Grails服务的Spock测试中的交互太少

好的,在这里我的问题:我有一个Grails服务执行某些操作的方法,包括调用相同服务类的void方法。这里的代码:

class myService { 
    void myStuff(def myObj, params) { 
     // do my stuff 

     anotherMethod(myObj) 

     //do my stuff again 
    } 

    void anotherMethod(myObj) { 
     // do other stuff 
    } 
} 

我想确保myStuff方法调用另一个方法,以测试和记录正确的行为。

所以,这里是我的斯波克规范类测试:

void 'test myStuff method'() { 
    given: 'my object and some params'  
     // doesn't really matter what I'm doing here 
     MyObject myObj = new MyObject() 
     params = [title: 'my object'] 

    when: 'we call myStuff()' 
     service.myStuff(myObj, params) 

    then: 'anotherMethod() is called exactly one times' 
     1 * service.anotherMethod(myObj) 
    } 
} 

我得到的错误是:

Too few invocations for: 

1 * service.anotherMethod(myObj) (0 invocations) 

你觉得呢?怎么了?

一如既往,在此先感谢。

回答

4

您所要求的模拟的一个非常特殊的,一般不鼓励,形式称为部分嘲讽其中被测在类的方法被嘲笑。 Spock从0.7开始支持这个,但是你必须创建一个Spy()而不是一个Mock()。另外请注意,你不能模拟私人方法。有关间谍的更多信息,请参阅reference documentation

+0

感谢您的回答。我理解你的担忧,基本上我这样做是因为myStuff()方法基本上是具有特定参数的anotherMethod()调用的“别名”,并且我想用测试来记录此特定行为。我会尝试一下Spy(),以此为契机将我的Grails插件中的Spock插件更新到0.7版本。 – lucke84

+1

部分模拟和间谍为我工作。 我所做的(双引号之间的“代码”)是在测试的给定部分添加一个Spy,就像这个“def myService = Spy(MyService)”,然后使用间谍myService而不是典型的服务'实例。 测试的其余部分非常简单:“when:myService.myStuff(myObj,params)then:1 * myService.anotherMethod(_)”。 – lucke84