单元测试Controller - MissingMethodException时无法模拟Grails服务方法 [英] Unable to mock Grails Service method when unit testing Controller - MissingMethodException
问题描述
我该如何解决这个问题?
当我从控制器(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屋!