6

次のような 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 で開発) からこのエンドポイントに対して呼び出しを実行すると、うまく動作しますが、テストを実行すると、追跡できない "Content type 'application/json' which is being being a HttpMediaTypeNotSupportedException" エラーが発生します。下。リクエストが私のメソッドにヒットすることはないようです。ここで簡単なものが欠けていますか?

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());

}
4

1 に答える 1

0

Acceptまた、テストに「application/json」のヘッダーを含める必要があります。Spring consumes="application/json"MVC は Accept ヘッダーの値を Consumers の値に一致させてから、マップされたメソッドを呼び出します。

于 2012-12-09T00:00:38.943 に答える