Programing

Mock MVC-테스트 할 요청 매개 변수 추가

crosscheck 2020. 11. 25. 07:39
반응형

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.usernameand 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

반응형