Ich benutze Spring 3.2 Mock MVC, um meinen Controller zu testen. Mein Code ist
@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);
}
und ich schrieb folgenden 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"));
}
Was ich bekomme ist
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)
Warum passiert das? Ist es der richtige Weg, das @RequestParam zu übergeben?
spring
spring-mvc
spring-mvc-test
Jackyesind
quelle
quelle
print()
ist eine Methode derMockMvcResultHandlers
KlasseWenn jemand auf diese Frage gekommen ist und nach Möglichkeiten gesucht hat, mehrere Parameter gleichzeitig hinzuzufügen (mein Fall), können Sie
.params
eine MultivalueMap verwenden, anstatt jeden hinzuzufügen.param
:LinkedMultiValueMap<String, String> requestParams = new LinkedMultiValueMap<>() requestParams.add("id", "1"); requestParams.add("name", "john"); requestParams.add("age", "30"); mockMvc.perform(get("my/endpoint").params(requestParams)).andExpect(status().isOk())
quelle
@ModelAttribute
ist eine Spring-Zuordnung von Anforderungsparametern zu einem bestimmten Objekttyp. so Ihre Parameter aussehen könntenuserClient.username
unduserClient.firstName
usw. als MockMvc eine Anfrage von einem Browser imitiert, müssen Sie in den Parametern zu übergeben , dass Spring aus einem Formular verwenden würde , um tatsächlich das Bau -UserClient
Objekt.(Ich denke, ModelAttribute ist eine Art Helfer, um ein Objekt aus einer Reihe von Feldern zu erstellen, die aus einem Formular eingehen werden, aber Sie möchten vielleicht etwas lesen, um eine bessere Definition zu erhalten.)
quelle