sirve requestmapping que puede para método mvc formulario escritura encontrar ejemplo commandname atributo arquitectura spring spring-mvc spring-mvc-test

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)