requestmapping - spring mvc ejemplo
Mock MVC-Agregar parámetro de solicitud para probar (2)
Estoy usando primavera 3.2 simulacro de mvc para probar mi controlador. Mi código es
@Autowired
private Client client;
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String initUserSearchForm(ModelMap modelMap) {
User user = new User();
modelMap.addAttribute("User", user);
return "user";
}
@RequestMapping(value = "/byName", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public
@ResponseBody
String getUserByName(@RequestParam("firstName") String firstName,
@RequestParam("lastName") String lastName, @ModelAttribute("userClientObject") UserClient userClient) {
return client.getUserByName(userClient, firstName, lastName);
}
y escribí la siguiente prueba:
@Test
public void testGetUserByName() throws Exception {
String firstName = "Jack";
String lastName = "s";
this.userClientObject = client.createClient();
mockMvc.perform(get("/byName")
.sessionAttr("userClientObject", this.userClientObject)
.param("firstName", firstName)
.param("lastName", lastName)
).andExpect(status().isOk())
.andExpect(content().contentType("application/json"))
.andExpect(jsonPath("$[0].id").exists())
.andExpect(jsonPath("$[0].fn").value("Marge"));
}
lo que obtengo es
java.lang.AssertionError: Status expected:<200> but was:<400>
at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)
at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89)
at org.springframework.test.web.servlet.result.StatusResultMatchers$5.match(StatusResultMatchers.java:546)
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:141)
¿Por qué sucede esto? ¿Es correcto pasar el @RequestParam
Cuando analicé tu código. También me he enfrentado al mismo problema, pero mi problema es que si doy valor tanto para el nombre como para el apellido significa que está funcionando bien. pero cuando doy solo un valor, significa que dice 400. de todos modos use el método .andDo (print ()) para descubrir el error
public void testGetUserByName() throws Exception {
String firstName = "Jack";
String lastName = "s";
this.userClientObject = client.createClient();
mockMvc.perform(get("/byName")
.sessionAttr("userClientObject", this.userClientObject)
.param("firstName", firstName)
.param("lastName", lastName)
).andDo(print())
.andExpect(status().isOk())
.andExpect(content().contentType("application/json"))
.andExpect(jsonPath("$[0].id").exists())
.andExpect(jsonPath("$[0].fn").value("Marge"));
}
Si su problema es org.springframework.web.bind.missingservletrequestparameterexception
, debe cambiar el código a
@RequestMapping(value = "/byName", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public
@ResponseBody
String getUserByName(@RequestParam( value="firstName",required = false) String firstName,
@RequestParam(value="lastName",required = false) String lastName, @ModelAttribute("userClientObject") UserClient userClient) {
return client.getUserByName(userClient, firstName, lastName);
}
@ModelAttribute
es un mapeo de primavera de los parámetros de solicitud para un tipo de objeto particular. para que sus parámetros se vean como userClient.username
y userClient.firstName
, etc. a medida que MockMvc imita una solicitud de un navegador, deberá pasar los parámetros que Spring usaría de un formulario para construir realmente el objeto UserClient
.
(Creo que ModelAttribute es una especie de ayuda para construir un objeto a partir de un conjunto de campos que van a venir de un formulario, pero es posible que desee leer un poco para obtener una mejor definición)