Mock MVC - Anforderungsparameter zum Testen hinzufügen


76

Ich benutze Spring 3.2 Mock MVC, um meinen Controller zu testen. Mein Code ist

 @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);
        }

und ich schrieb folgenden Test:

@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"));
}

Was ich bekomme ist

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)

Warum passiert das? Ist es der richtige Weg, das @RequestParam zu übergeben?

Antworten:


106

Als ich deinen Code analysiert habe. Ich habe auch das gleiche Problem gehabt, aber mein Problem ist, wenn ich Wert für Vor- und Nachnamen gebe, bedeutet dies, dass es gut funktioniert. aber wenn ich nur einen Wert gebe, heißt das 400. Verwenden Sie trotzdem die Methode .andDo (print ()), um den Fehler herauszufinden

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"));
}

Wenn Ihr Problem ist org.springframework.web.bind.missingservletrequestparameterexception, müssen Sie Ihren Code in ändern

@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);
    }

Ich habe den gleichen Code geschrieben, habe aber ein Problem mit modelAttribute. Bitte lesen Sie stackoverflow.com/questions/19427341/…
gstackoverflow

11
Beachten Sie, print()ist eine Methode der MockMvcResultHandlersKlasse
WildDev

7

Wenn jemand auf diese Frage gekommen ist und nach Möglichkeiten gesucht hat, mehrere Parameter gleichzeitig hinzuzufügen (mein Fall), können Sie .paramseine MultivalueMap verwenden, anstatt jeden hinzuzufügen .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

@ModelAttributeist eine Spring-Zuordnung von Anforderungsparametern zu einem bestimmten Objekttyp. so Ihre Parameter aussehen könnten userClient.usernameund userClient.firstNameusw. als MockMvc eine Anfrage von einem Browser imitiert, müssen Sie in den Parametern zu übergeben , dass Spring aus einem Formular verwenden würde , um tatsächlich das Bau - UserClientObjekt.

(Ich denke, ModelAttribute ist eine Art Helfer, um ein Objekt aus einer Reihe von Feldern zu erstellen, die aus einem Formular eingehen werden, aber Sie möchten vielleicht etwas lesen, um eine bessere Definition zu erhalten.)


Ich habe ModelAttribute verwendet, bevor das kein Problem war. Ich habe verwechselt mit dem Senden von @RequestParam
jackyesind
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.