web-dev-qa-db-fra.com

Mock MVC - Ajouter un paramètre de requête à tester

J'utilise Spring 3.2 mock mvc pour tester mon contrôleur. Mon code est

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

et j'ai écrit le test suivant:

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

}

ce que je reçois c'est

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)

Pourquoi cela arrive? Est-ce la bonne façon de passer le @RequestParam?

63
jackyesind

Quand j'ai analysé votre code. J'ai également rencontré le même problème, mais mon problème est que si je donne de la valeur pour le prénom et le nom, cela signifie que cela fonctionne bien. mais quand je donne une seule valeur signifie qu'il dit 400. de toute façon utilisez la méthode .andDo (print ()) pour trouver l'erreur

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

Si votre problème est org.springframework.web.bind.missingservletrequestparameterexception vous devez changer votre code en

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

@ModelAttribute est un mappage de printemps des paramètres de demande sur un type d'objet particulier. si vos paramètres peuvent ressembler à userClient.username et userClient.firstName, etc., car MockMvc imite une requête d'un navigateur, vous devez transmettre les paramètres que Spring utiliserait à partir d'un formulaire pour créer réellement l'objet UserClient.

(Je pense que ModelAttribute est une sorte d'aide pour construire un objet à partir d'un groupe de champs qui vont provenir d'un formulaire, mais vous voudrez peut-être lire un peu pour obtenir une meilleure définition.)

0
incomplete-co.de