J'utilise Spring 3.2 mock mvc pour tester mon contrôleur. Mon code est
@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);
}
et j'ai écrit le test suivant:
@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"));
}
ce que je reçois c'est
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)
Pourquoi cela arrive? Est-ce la bonne façon de passer le @RequestParam?
Quand j'ai analysé votre code. J'ai également rencontré le même problème, mais mon problème est que si je donne de la valeur pour le prénom et le nom, cela signifie que cela fonctionne bien. mais quand je donne une seule valeur signifie qu'il dit 400. de toute façon utilisez la méthode .andDo (print ()) pour trouver l'erreur
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 votre problème est org.springframework.web.bind.missingservletrequestparameterexception
vous devez changer votre code en
@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
est un mappage de printemps des paramètres de demande sur un type d'objet particulier. si vos paramètres peuvent ressembler à userClient.username
et userClient.firstName
, etc., car MockMvc imite une requête d'un navigateur, vous devez transmettre les paramètres que Spring utiliserait à partir d'un formulaire pour créer réellement l'objet UserClient
.
(Je pense que ModelAttribute est une sorte d'aide pour construire un objet à partir d'un groupe de champs qui vont provenir d'un formulaire, mais vous voudrez peut-être lire un peu pour obtenir une meilleure définition.)