web-dev-qa-db-ja.com

MVC Mock-要求パラメーターをテストに追加

私はコントローラをテストするためにスプリング3.2モック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を渡すのは正しい方法ですか

63
jackyesind

コードを分析したとき。私も同じ問題に直面しましたが、私の問題は、姓と名の両方に値を与えると、それがうまく機能していることを意味します。しかし、値を1つだけ指定すると、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);
    }
85
muthu

@ModelAttributeは、リクエストパラメータの特定のオブジェクトタイプへのSpringマッピングです。 MockMvcがブラウザーからのリクエストを模倣するため、パラメーターはuserClient.usernameuserClient.firstNameなどのようになります。Springが実際にUserClientを構築するためにフォームから使用するパラメーターを渡す必要があります。オブジェクト。

(ModelAttributeは、フォームから入力されるフィールドの集合からオブジェクトを構築するための一種のヘルパーだと思いますが、より良い定義を得るためにいくつかの読み取りを行うことができます)

0