单元测试Controller - MissingMethodException时无法模拟Grails服务方法 [英] Unable to mock Grails Service method when unit testing Controller - MissingMethodException

查看:134
本文介绍了单元测试Controller - MissingMethodException时无法模拟Grails服务方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

测试控制器时会出现以下错误消息 - 请参阅下面的代码。
我该如何解决这个问题?
当我从控制器(run-app)调用服务方法时,它可以正常工作。

例外:


groovy.lang.MissingMethodException:无方法签名:
grails.test.GrailsMock.isOk()适用于参数类型:
(java.lang.String)values:[H] at ... VControllerSpec.test
something(VControllerSpec.groovy:)

class: VControllerSpec

 导入grails.test.mixin.TestFor 
import spock.lang.Specification

@TestFor(VController)
@Mock(VService)
class VControllerSpec extends Specification {

voidtest (){
给定:
def vServiceMock = mockFor(VService)
vServiceMock.demand.isOk {String yeah - >返回true}
controller.vService = vServiceMock.createMock()

当:
def isO =​​ vServiceMock.isOk(H)

then :
isO =​​= true
}
}

class: VService

  import grails.transaction.Transactional 

@Transactional
class VService {
def isOk = {String yeah - >
def isO =​​ false
return isO
}
}

感谢,
史蒂夫

解决方案

假设 code>为:

  def myAction(){
vService.isOk('Hello')

以下测试应该通过$ / b
$ b <$ (){
给定:
def vServiceMock = mockFor(FormatService)
vServiceMock.demand.isOk {String yeah - >返回true}
controller.vService = vServiceMock.createMock()

当:
def isO =​​ controller.myAction()

then:
isO =​​= true
}

这里有几件事要优化,包括使用方法 isOk ,而不是闭包作为最佳实践。


Am getting the following error message when testing the controller - see below for code. How can I correct this? When I invoke the service method from the controller (run-app) and it works fine.

Exception:

groovy.lang.MissingMethodException: No signature of method: grails.test.GrailsMock.isOk() is applicable for argument types: (java.lang.String) values: [H] at ...VControllerSpec.test something(VControllerSpec.groovy:)

class: VControllerSpec

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(VController)
@Mock(VService)
class VControllerSpec extends Specification {

    void "test something"() {
        given:
        def vServiceMock = mockFor(VService)
        vServiceMock.demand.isOk { String yeah -> return true }
        controller.vService = vServiceMock.createMock()

        when:
        def isO = vServiceMock.isOk("H") 

        then:
        isO == true     
    }
}

class:VService

import grails.transaction.Transactional

@Transactional
class VService {
    def isOk = { String yeah ->     
        def isO = false
        return isO
    }
}

Thanks, Steve

解决方案

Assuming there is an action in VController as:

def myAction() {
    vService.isOk('Hello')
}

below test should pass

void 'test service'() {
    given:
    def vServiceMock = mockFor(FormatService)
    vServiceMock.demand.isOk { String yeah -> return true }
    controller.vService = vServiceMock.createMock()

    when:
    def isO = controller.myAction() 

    then:
    isO == true
}

There are few things to optimize here including using a method isOk instead of a closure as best practices.

这篇关于单元测试Controller - MissingMethodException时无法模拟Grails服务方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆