首页 > 解决方案 > spring MockMVC 中是否有一种方法可以将 json 内容作为对象获取?

问题描述

在我的 Spring 项目中,我创建了一些检查控制器/http-api 的测试。有没有办法将响应的 json 内容作为反序列化对象?

在其他项目中,我使用了“放心”和“有”的方法来直接获取预期对象的结果。

这是一个例子:

    MvcResult result = rest.perform( get( "/api/byUser" ).param( "userName","test_user" ) )

            .andExpect( status().is( HttpStatus.OK.value() ) ).andReturn();
    String string = result.getResponse().getContentAsString();

该方法以 json 形式返回特定类型。如何将此 json 转换回对象以测试其内容?我知道杰克逊或放心的方法,但在 spring/test/mockmvc 中有方法吗

喜欢getContentAs(Class)

标签: jsonspringspring-mvcjunit

解决方案


据我所知MockHttpServletResponse(与 RestTemplate 不同)没有任何方法可以将返回的 JSON 转换为特定类型。

所以你可以做的是使用 JacksonObjectMapper将 JSON 字符串转换为特定类型

像这样的东西

String json = rt.getResponse().getContentAsString();
SomeClass someClass = new ObjectMapper().readValue(json, SomeClass.class);

这将使您有更多的控制权来断言不同的事情。

话虽如此,MockMvc::performreturn ResultActionswhich 有一个方法,该方法andExpect采用ResultMatcher. 这有很多选项可以在不将其转换为对象的情况下测试生成的 json。

例如

mvc.perform(  .....
                ......
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.firstname").value("john"))
                .andExpect(jsonPath("$.lastname").value("doe"))
                .andReturn();

推荐阅读