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.match(StatusResultMatchers.java:546)
    at org.springframework.test.web.servlet.MockMvc.andExpect(MockMvc.java:141)

почему это происходит? Это правильный способ передать @RequestParam

2 ответов


когда я анализировал ваш код. Я также столкнулся с той же проблемой, но моя проблема в том, что если я даю значение для имени и фамилии, значит, он работает нормально. но когда я даю только одно значение, это означает, что он говорит 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 - Это весеннее отображение параметров запроса на определенный тип объекта. таким образом, ваши параметры могут выглядеть как userClient.username и userClient.firstName, etc. поскольку MockMvc имитирует запрос из браузера, вам нужно будет передать параметры, которые Spring будет использовать из формы, чтобы фактически создать UserClient "объект".

(Я думаю, что ModelAttribute является своего рода помощником для создания объекта из группы полей, которые будут поступать из формы, но вы можете захотеть сделать некоторое чтение получите лучшее определение)