grails - 如何在 Grails 集成测试中部分模拟服务

标签 grails groovy spock

我正在尝试为调用服务方法的 Controller 编写测试。我想在该服务中模拟一个依赖方法。

我的规范如下:

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()
}

当我尝试运行此测试时,我收到以下错误:

失败:|
我的 spy 应该被称为(spybug.MyControllerSpec)
|
调用太少:
1 * mockMyService.methodToSpy()(0 次调用)
不匹配的调用(按相似度排序):
1 * mockMyService.serviceMethod()
1 * mockMyService.invokeMethod('methodToSpy', [])
1 * mockMyService.invokeMethod('println', ['in serviceMethod about to call methodToSpy'])
1 * mockMyService.invokeMethod('println', ['Back from methodToSpy'])

如您所见,Spock 正在捕获 Groovy 的 invokeMethod 调用,而不是对实际方法的后续调用。为什么会这样?

完整的项目可用here .

最佳答案

试试这个:

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

    when:
    myController.callService()

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

根据 stub 的 spock 文档,如果要使用基数,则必须使用 Mock 而不是 Stub。

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

关于grails - 如何在 Grails 集成测试中部分模拟服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32104348/

相关文章:

gradle - 如何在 gradle 中为基于 ext 的属性分配默认值

Grails 2.2.3 在类路径上找不到 Spock

grails - pageProperty 和内联 IF 条件

maven - 即使有插件,也无法从Grails插件存储库下载

jquery - Grails中的Ajax驱动选择不刷新选择

groovy - 如何将 DEFAULT 自定义 header 值插入所有 SoapUI 项目?

http - 如何使用 Groovy 脚本从 Http 请求获得唯一成功(200 ok)响应

grails - 如何在Grails单元测试中模拟Ajax请求

groovy - 期望 block 中的条件

grails - Grails-每天的新日志