Mock MVC-테스트 할 요청 매개 변수 추가
내 컨트롤러를 테스트하기 위해 Spring 3.2 mock 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을 전달하는 것이 올바른 방법입니까?
내가 당신의 코드를 분석했을 때. 나는 또한 같은 문제에 직면했지만 이름과 성 모두에 가치를 부여하면 잘 작동한다는 것을 의미합니다. 하지만 하나의 값만 제공하면 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
and userClient.firstName
등이 될 수 있습니다 UserClient
. 실제로 객체를 빌드하기 위해 Spring이 폼에서 사용할 매개 변수를 전달해야 합니다.
(i think of ModelAttribute is kind of helper to construct an object from a bunch of fields that are going to come in from a form, but you may want to do some reading to get a better definition)
If anyone came to this question looking for ways to add multiple parameters at the same time (my case), you can use .params
with a MultivalueMap instead of adding each .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())
참고URL : https://stackoverflow.com/questions/17972428/mock-mvc-add-request-parameter-to-test
'Programing' 카테고리의 다른 글
Spring HandlerInterceptor 대 서블릿 필터 (0) | 2020.11.25 |
---|---|
R의 glm 모델에 모든 양방향 상호 작용을 자동으로 포함하는 방법 (0) | 2020.11.25 |
Mocha에서 describe ()의 역할은 무엇입니까? (0) | 2020.11.25 |
자동 업데이트는 어떻게 구현해야합니까? (0) | 2020.11.25 |
PowerShell에서 "종료"란 정확히 무엇입니까? (0) | 2020.11.25 |