【问题标题】:Too few interactions in a Spock test for a Grails serviceGrails 服务的 Spock 测试中的交互太少
【发布时间】:2012-11-27 18:07:56
【问题描述】:

我以为我已经了解了 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 方法调用另一个方法,以测试和记录正确的行为。

所以,这是我的 Spock 规范类中的测试:

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)

你怎么看?怎么了?

一如既往,提前致谢。

【问题讨论】:

    标签: testing grails service spock


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我理解您的担忧,基本上我这样做是因为 myStuff() 方法基本上是具有特定参数的 anotherMethod() 调用的“别名”,我想通过测试记录这种特定行为。我将尝试使用 Spy(),借此机会在我的 Grails 应用程序中将 Spock 插件更新到 0.7 版:)
    • 部分嘲弄和间谍对我有用。我所做的(双引号之间的“代码”)是在测试的给定部分添加一个间谍,就像这个“def myService = Spy(MyService)”,然后使用间谍 myService 而不是典型的“服务”实例.测试的其余部分非常简单:“when: myService.myStuff(myObj, params) then: 1 * myService.anotherMethod(_)”。
    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多