2012-12-08 7 views
6

Ho un metodo Resto controller utilizzando Primavera 3.1 che assomiglia a questo:Spring MVC 3 tipo di contenuto "application/json" funziona dal Cliente ma non da test di unità

@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); 
     } 
} 

ho prova che assomiglia a questo :

@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", "[email protected]"); 
    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); 
} 

quando eseguo una chiamata contro questo endpoint dal mio cliente app (sviluppato con angolare) funziona benissimo, ma quando corro la mia prova ho ottenere un "tipo di contenuto 'application/json', che proviene da un errore HttpMediaTypeNotSupportedException "che non riesco a rintracciare. La richiesta non sembra mai colpire il mio metodo. Mi sto perdendo qualcosa di semplice qui?

Risolto questo problema passando al quadro spring-mvc-test e costruire il mio test come questo:

@Test 
public void testAddUser() throws Exception { 

    ObjectNode userJson = mapper.createObjectNode(); 
    userJson.put("userId", "jonnbz"); 
    userJson.put("email", "[email protected]"); 
    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()); 

} 
+2

È necessario rispondere alla propria domanda anziché aggiornare la domanda con la risposta in linea. – ddewaele

risposta

0

Si dovrebbe anche includere un Accept intestazione di "application/json" nel test, dal momento che è stato incluso a consumes="application/json", Spring MVC abbinerà il valore di intestazione Accept al valore consumes e solo dopo chiamerà il metodo mappato.

+0

ha aggiunto l'intestazione Accept sia alla richiesta che alla risposta nel test setHeader ("Accept", MediaType.APPLICATION_JSON_VALUE) ma senza risultati – Maleck13

Problemi correlati