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


person jackyesind    schedule 31.07.2013    source източник


Отговори (3)


Когато анализирах вашия код. Аз също се сблъсках със същия проблем, но проблемът ми е, че ако дам стойност както за име, така и за фамилия, това означава, че работи добре. но когато дам само една стойност, това означава, че тя казва 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);
    }
person muthu    schedule 01.08.2013
comment
Написах същия код, но имам проблем с modelAttribute. моля, прочетете stackoverflow.com/questions/19427341/ - person gstackoverflow; 17.10.2013
comment
Обърнете внимание, print() е метод от MockMvcResultHandlers клас - person WildDev; 04.11.2015

Ако някой е стигнал до този въпрос, търсейки начини за добавяне на няколко параметъра едновременно (моят случай), можете да използвате .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())
person victortv    schedule 30.09.2019

@ModelAttribute е Spring съпоставяне на параметрите на заявката към определен тип обект. така че вашите параметри може да изглеждат като userClient.username и userClient.firstName и т.н. тъй като MockMvc имитира заявка от браузър, ще трябва да предадете параметрите, които Spring ще използва от формуляр, за да изгради действително обекта UserClient.

(Мисля, че ModelAttribute е вид помощник за конструиране на обект от куп полета, които ще влязат от формуляр, но може да искате да направите малко четене, за да получите по-добра дефиниция)

person incomplete-co.de    schedule 31.07.2013
comment
Използвах ModelAttribute преди това не беше проблем. Обърках се с това как да изпратя @RequestParam - person jackyesind; 01.08.2013