Макет MVC - додайте параметр запиту для тестування


77

Я використовую 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

Відповіді:


108

Коли я проаналізував ваш код. Я також стикався з тією ж проблемою, але моя проблема полягає в тому, що якщо я вказую значення як для імені, так і для прізвища, це означає, що він працює нормально. але коли я даю лише одне значення, це означає, що воно означає 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. будь ласка , прочитайте stackoverflow.com/questions/19427341 / ...
gstackoverflow

11
Візьміть до відома, print()це метод MockMvcResultHandlersзанять
WildDev

8

Якщо хто -то прийшов на це питання шукають способи , щоб додати кілька параметрів одночасно (мій випадок), ви можете використовувати .paramsз MultivalueMap замість додавання кожного .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())

0

@ModelAttribute- це весняне відображення параметрів запиту до певного типу об’єкта. так що ваші параметри можуть виглядати як userClient.usernameі userClient.firstNameт. д., оскільки MockMvc імітує запит браузера, вам потрібно буде передати параметри, які Spring використовував би з форми для фактичної побудови UserClientоб'єкта.

(я думаю, що ModelAttribute - це свого роду помічник для побудови об’єкта з безлічі полів, які збираються надходити з форми, але ви можете прочитати, щоб отримати краще визначення)


Я раніше використовував ModelAttribute, і це не було проблемою. Я плутаю з тим, як надіслати @RequestParam
jackyesind
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.