I am using spring 3.2 mock mvc to test my controller.My code is
@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); }
and I wrote following test:
@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")); }
what i get is
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)
Why this happens? Is it right way to pass the @RequestParam
When i analyzed your code. I have also faced the same problem but my problem is if i give value for both first and last name means it is working fine. but when i give only one value means it says 400. anyway use the .andDo(print()) method to find out the 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")); }
If your problem is org.springframework.web.bind.missingservletrequestparameterexception
you have to change your code to
@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); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With