Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spock-stubing JSON响应_Java_Unit Testing_Grails_Groovy_Spock - Fatal编程技术网

Java Spock-stubing JSON响应

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

我将Grails3.1.7与内置spock一起使用。在单元测试执行期间,似乎我在存根控制器提供的服务的返回值时遇到了问题。服务方法返回null,然后控制器抛出GroovyRuntimeException,抱怨由于返回的“null”而“无法解析要调用的方法”

控制器动作代码示例:

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对象的模拟似乎足以让它正常工作:)