Java Spock-stubing JSON响应
我将Grails3.1.7与内置spock一起使用。在单元测试执行期间,似乎我在存根控制器提供的服务的返回值时遇到了问题。服务方法返回null,然后控制器抛出GroovyRuntimeException,抱怨由于返回的“null”而“无法解析要调用的方法” 控制器动作代码示例:Java Spock-stubing JSON响应,java,unit-testing,grails,groovy,spock,Java,Unit Testing,Grails,Groovy,Spock,我将Grails3.1.7与内置spock一起使用。在单元测试执行期间,似乎我在存根控制器提供的服务的返回值时遇到了问题。服务方法返回null,然后控制器抛出GroovyRuntimeException,抱怨由于返回的“null”而“无法解析要调用的方法” 控制器动作代码示例: def register(RequestRegistrationCommand rrc) { //some logic render ajaxResponseService.composeJsonResp
def register(RequestRegistrationCommand rrc) {
//some logic
render ajaxResponseService.composeJsonResponse(rrc)
}
服务的方法代码示例:
JSON composeJsonResponse(instance, String successMessage = null) {
//some logic
[success: success, messages: messages] as JSON
}
部分测试套件代码:
//field definitions
def requestRegistrationCommand = Mock(RequestRegistrationCommand)
def ajaxResponseService = Mock(AjaxResponseService)
def setup() {
controller.ajaxResponseService = ajaxResponseService
.....
}
void "Testing register() action"() {
when: 'Passing invalid register params'
...
params.email = INVALID_EMAIL
controller.register(requestRegistrationCommand)
then: 'JSON response returned'
...
1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> [asd:123] as JSON //tried plenty of things here
}
有趣的是,交互本身是被触发的(通过将其替换为“0*\”进行检查,并将“1*ajaxR…>>“asd'”与无法将字符串转换为JSON的错误放在一起)。因此,交互可能会返回一些存根值,但无论如何,在我尝试的大多数情况下,控制器的行为就像它试图呈现null:
groovy.lang.GroovyRuntimeException:不明确的方法重载
方法
grails.artifact.controller.support.responsenderer$Trait$Helper#render。
无法解析要为[class]调用的方法
com.tempvs.controllers.AuthController,null]由于重叠
接口之间的原型
grails.artefact.controller.support.ResponseRenderer,接口
java.lang.CharSequence][接口
grails.artefact.controller.support.ResponseRenderer,接口
java.util.Map][接口
grails.artefact.controller.support.ResponseRenderer,接口
org.grails.web.converters.Converter]
com.tempvs.controllers.AuthController.register(AuthController.groovy:45)
在com.tempvs.controllers.AuthControllerSpec.Testing register()上
动作(AuthControllerSpec.groovy:97)
我做错了什么?我应该如何强制模拟服务对象返回非null值以避免控制器渲染失败
如果需要更多信息,请通知我,我尽量简短。提前谢谢
UPD
交互测试通过:
1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> Mock(JSON)
当我将AjaxResponseService#composeJsonResponse()返回类型从JSON更改为def时。但是拜托,我只使用一个模拟的合作者进行测试,我怎么能强迫它支持显式类型 返回值应使用闭包:
1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> { [asd:123] as JSON }
def json = Mock(JSON)
....
1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> json
请参阅(请参阅返回值部分):
您可能只需要用括号括起返回:
1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> ( [asd:123] as JSON )
实际上,我通过模拟返回值解决了这个问题:
1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> { [asd:123] as JSON }
def json = Mock(JSON)
....
1 * ajaxResponseService.composeJsonResponse(requestRegistrationCommand) >> json
感谢您的回答,但对JSON对象的模拟似乎足以让它正常工作:)