私はコントローラをテストするためにスプリング3.2モックmvcを使用しています。私のコードは
@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);
}
そして、私は次のテストを書きました:
@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"));
}
私が得るものは
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)
なぜこれが起こるのですか? @RequestParamを渡すのは正しい方法ですか
コードを分析したとき。私も同じ問題に直面しましたが、私の問題は、姓と名の両方に値を与えると、それがうまく機能していることを意味します。しかし、値を1つだけ指定すると、400と表示されます。とにかく.andDo(print())メソッドを使用してエラーを見つけます。
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"));
}
問題がorg.springframework.web.bind.missingservletrequestparameterexception
の場合、コードを次のように変更する必要があります
@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
は、リクエストパラメータの特定のオブジェクトタイプへのSpringマッピングです。 MockMvcがブラウザーからのリクエストを模倣するため、パラメーターはuserClient.username
やuserClient.firstName
などのようになります。Springが実際にUserClient
を構築するためにフォームから使用するパラメーターを渡す必要があります。オブジェクト。
(ModelAttributeは、フォームから入力されるフィールドの集合からオブジェクトを構築するための一種のヘルパーだと思いますが、より良い定義を得るためにいくつかの読み取りを行うことができます)