json - spring mvc 3 内容类型 "application/json"可从客户端运行,但不能从单元测试运行

标签 json rest spring-mvc

我有一个使用 Spring 3.1 的 Rest Controller 方法,如下所示:

@RequestMapping(value="/user", method=RequestMethod.POST, consumes={MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<String> addUser(@RequestBody @Valid User user){   
    System.out.println("called / user method");
      try{
        user = userService.addUser(user); 
        return responseBuilder.addApiResourceSucceeded(user,null);
      }catch(Exception e){
        return responseBuilder.apiActionFailed("user already exists", HttpStatus.CONFLICT);  
      }
}

我有一个看起来像这样的测试:
@Before
public void setUp() {
    adapter = new AnnotationMethodHandlerAdapter();
    request = new MockHttpServletRequest();
    response = new MockHttpServletResponse();
    mapper = new ObjectMapper();
}
@Test
public void testAddUser() throws Exception {
    request.setMethod("POST");
    request.setContentType(MediaType.APPLICATION_JSON_VALUE);
    request.setRequestURI("/user");

    ObjectNode userJson = mapper.createObjectNode();
    userJson.put("userId", "jonnybz");
    userJson.put("email", "test@gmail.com");
    userJson.put("password", "password");
    userJson.put("longitude",-10.127205999);
    userJson.put("latitude", 57.252269);
    ArrayNode arrNode = mapper.createArrayNode();
    arrNode.add(-10.1272059999);
    arrNode.add(57.2522);
    userJson.put("lonLat",arrNode);
    request.setContent(mapper.writeValueAsBytes(userJson));
    adapter.handle(request, response, userController); 

    String content = response.getContentAsString();
    assertEquals(200, response.getStatus());
    User user = dao.listAll().get(0);
    objectId = user.getId();
    assertNotNull(objectId);
}

当我从我的客户端应用程序(使用 angular 开发)执行对此端点的调用时,它运行良好,但是当我运行我的测试时,我收到一个“来自 HttpMediaTypeNotSupportedException 的内容类型‘application/json’”错误,我无法跟踪下。该请求似乎从未达到我的方法。我在这里错过了一些简单的东西吗?

已解决 这个问题通过切换到 spring-mvc-test框架并像这样构建我的测试:
@Test
public void testAddUser() throws Exception {

    ObjectNode userJson = mapper.createObjectNode();
    userJson.put("userId", "jonnbz");
    userJson.put("email", "test@gmail.com");
    userJson.put("password", "password");
    userJson.put("longitude",-10.667205999);
    userJson.put("latitude", 74.252269);
    ArrayNode arrNode = mapper.createArrayNode();
    arrNode.add(-10.667205999);
    arrNode.add(74.252269);
    userJson.put("lonLat",arrNode);
    MvcResult res = MockMvcBuilders.xmlConfigSetup("classpath:test-context.xml").build()
           .perform(MockMvcRequestBuilders.post("/user")
           .accept(MediaType.APPLICATION_JSON)
           .contentType(MediaType.APPLICATION_JSON)
           .body(mapper.writeValueAsBytes(userJson)))
           .andExpect(status().isOk())
           .andExpect(content().type(MediaType.APPLICATION_JSON))
           .andReturn();
            System.out.println(res.getResponse().getContentAsString());

}

最佳答案

您还应该包括 Accept测试中“application/json”的标题,因为您包含了 consumes="application/json" ,Spring MVC 会将 Accept header 值与消耗值匹配,然后才调用映射的方法。

关于json - spring mvc 3 内容类型 "application/json"可从客户端运行,但不能从单元测试运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13782252/

相关文章:

c# - 反序列化之前使用 System.Text.Json 序列化的文件时出现异常

java - Spring Boot (1.3.5) - 默认错误 View

java - 无法找到逻辑名称为 @embeddedid 的列

java - Hibernate实体虚拟列错误?

java - Spring ModelAndView.setViewName ("view")在错误位置搜索

c# - 为什么我的 C# 应用程序在此 REST 请求上会失败,但通过浏览器可以正常运行?

java - 找不到媒体类型 application/json 的 MessageBodyWriter

json - Wordpress API JSON 返回限制

node.js - 当在nodejs中运行http请求来测试我的rest api时,它停止了,为什么?

api - REST API 的并发检查?