在JSON内容类型的Grails单元测试(和一般)中使用自定义渲染器(Using custom re

2019-10-19 10:03发布

我试图让一个自定义的JSON呈现在我的REST API的工作异常。

我能拿到了大部分的我需要的自定义编组工作,但是我想有过,我没有在编组访问上下文控制。 Grails文档演示了如何编写自定义渲染器,我有一个,我觉得应该工作,但是单位期间,我不能用它测试我的REST控制器。

Grails的文档: http://grails.org/doc/2.3.4/guide/webServices.html#customRenderers

有谁知道我怎么会初始化此渲染在我的控制器动作单元测试过程中使用?

上述文件只是说如何设置它在resources.groovy文件。

当我用的是编组,我能够做到:

def setup(){
    //Set up the custom JSON marshallers
    JSON.registerObjectMarshaller(new CusomMarshaller(), 1)
}

但我没有看到提炼等效的方法。 任何人都可以点我在正确的方向?


更多详情:

这里是我的渲染器:

class JSONExceptionRenderer extends AbstractRenderer<Exception>{

JSONExceptionRenderer(){
    super(Exception, [MimeType.JSON, MimeType.HAL_JSON, MimeType.TEXT_JSON] as MimeType[])
}

@Override
void render(Exception object, RenderContext context) {
    log.warn("RENDERING")
    Exception exception = (Exception) object

    //Default to internal error
    Integer code = 500

    //If it is a defined exception with a more appropriate error code, then set it
    if(exception instanceof RestException){
        code = (Integer) ((RestException) exception).getCode()
    }else if(exception instanceof MissingResourceException){
        code = 404
    }
    context.status = HttpStatus.valueOf(code)

    //Write the JSON
    Writer writer = context.getWriter()
    Map content = ["code":code, "status":"error", "message":exception.message]
    JsonBuilder builder = new JsonBuilder(content)
    builder.writeTo(writer)

}
}

这是我想要得到它的工作方式:

try{
  log.info "Throwing exception"
  throw new NullPointerException("Test Exception")
}catch(Exception ex){
  render ex as JSON
}

谢谢!

Answer 1:

如果使用的是斯波克,您可以直接注入豆Specification

@TestFor(MyController)
class MyControllerSpec extends spock.lang.Specification {
     def myCustomRenderer //bean name used in resources.groovy

     //continue with tests
}

如果您正在使用JUnit测试,那么你可以使用defineBeans为:

@TestFor(MyController)
class MyControllerTests {
    void setup() {
         defineBeans {
            myCustomRenderer(com.example.MyCustomRenderer)
         }
    }

    //continue with tests
}

你可以参考这个答案 ,以及使用defineBeans的。

我相信这是你只需要做测试的渲染器的行为。



Answer 2:

之后在多源周围挖。 我以为我会在这里发布此为别人着想。

我的自定义渲染没有工作的原因是,你必须使用“响应”方法在控制器上:

respond object

这将检查类ControllersRestApi具有非常大的响应方法来找到你的渲染在rendererRegistry并使用它。 这比其中使用所述对象marshallers不同render as符号。

此外,您还需要冲洗的作家,这是不是在orgininal载文:

builder.writeTo(writer)
writer.flush()


文章来源: Using custom renderer in grails unit testing (and in general) on JSON content types