MockMVC 学习 - 参数部分

xu.wang

发布于 2019.04.22 21:20 阅读 2652 评论 0

本文是对之前同学写的一篇文章的补充,原文为:http://lindasoft.com/view/article/details?articleId=264

本文主要介绍在@ModelAttribute 和@RequestBody 的区别。

controller如下:

  @PostMapping("/insert")
    public JsonResult insert(@ModelAttribute RiskPlace riskPlace){
        JsonResult jsonResult = new JsonResult();
         
        log.info(riskPlace.toString());
      
        return jsonResult;
    }

Junit中的测试代码如下:

  @Test
    public void insert() {        
 //使用easyRandom  自动创建一个对象
        EasyRandom easyRandom = new EasyRandom();
        RiskPlace riskPlace = easyRandom.nextObject(RiskPlace.class);

        String param = JSONObject.toJSONString(riskPlace);
        MultiValueMap<String, String> paramMap = (MultiValueMap<String, String>) JSON.parse(param);
        try {
            mockMvc.perform(MockMvcRequestBuilders.post("/admin/riskPlace/insert")
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaType.APPLICATION_JSON)
                    .content(param))
                    .andDo(print())
                    .andExpect(status().isOk()).andReturn().getResponse().getContentAsString();
        } catch (Exception e) {
            e.printStackTrace();
        }
}

 

上面代码执行时,发现controller中  RiskPlace 并不能获取到参数,这个是为什么呢?

这里的@ModelAttribute是关键,@ModelAttribute 用于接收key,value形式参数。

而 @RequestBody 用于接受JSON对象,且@RequestBody用于post请求,不能用于get请求。

所以Controller修改为用@RequestBody接收参数即可

 @PostMapping("/insert")
    public JsonResult insert(@RequestBody RiskPlace riskPlace){
        JsonResult jsonResult = new JsonResult();

        log.info(riskPalce.toString());
       
        return jsonResult;
    }

 

 

若是Controller中使用@ModelAttribute时Mock怎么传值呢? 如下使用.param() / .params()即可。

  
    @Test
    public void insert() {
MockHttpServletRequestBuilder mockHttpServletRequestBuilder = null;
        try {
            mockHttpServletRequestBuilder = post( "/admin/riskPlace/insert")
                    .contentType(MediaType.APPLICATION_JSON)
                    .param("placeName","教室");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            mockMvc.perform(mockHttpServletRequestBuilder).andDo(print());
        } catch (Exception e) {
            e.printStackTrace();
        }
}