Controller 层编写测试类

前后端分离以后,Controller 部分的代码当然也要进行测试,但是往常我们的测试类无法发送http请求,这时就需要用到 MockMvc,

一个简单的例子:

测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class ControllerTest {
    protected MockMvc mockMvc;
    //集成Web环境,将会从该上下文获取相应的控制器并得到相应的MockMvc;
    @Autowired
    protected WebApplicationContext wac;

    @Before()
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();  //构造MockMvc对象
    }
    //单位数据量统计服务
    @Test
    public void goUnitDataStatSvcTest() throws Exception {
        Map map = new HashMap<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = sdf.parse("2018-11-20");
        Date endDate = sdf.parse("2018-11-23");
        map.put("startDate", "2018-11-20");
        map.put("endDate", sdf.format(endDate));
        map.put("instid", "2000");
        map.put("dateType", "other");
        log.info("总天数:"+UsedUtil.daysBetween(startDate, endDate));
        String content = JSONObject.toJSONString(map);
        String result = mockMvc.perform(post("/statistic/goUnitDataStatSvc")
                .contentType(MediaType.APPLICATION_JSON_UTF8)   // 请求中的媒体类型信息—json数据格式
                .content(content))  // RequestBody信息
                .andDo(print()) // 打印出请求和相应的内容
                .andExpect(status().isOk()) // 返回的状态是200
                .andReturn().getResponse().getContentAsString();    // 返回MvcResult并且转为字符串
        Assert.assertNotNull(result);
    }
}

 

控制层 Controller.java
@Controller
@RequestMapping("/statistic")
public class StatisticInfoController {
    @RequestMapping(value = "/goUnitDataStatSvc")
    @ResponseBody
    public ResponseMsg goUnitDataStatSvc(HttpServletRequest request, @RequestBody Map param) throws ParseException {
        // 获得参数
        String instid = userPlugins.getUser(request).getBackup1();
        Date startDate = startDateTransfer(param);
        Date endDate = endDateTransfer(param);
        // 是否选择了快捷选项,目前只有选择“全年-(month)”才有意义
        String dateType = String.valueOf(param.get("dateType")==null?"":param.get("dateType"));
        if(startDate == null || endDate == null || "".equals(instid)|| "".equals(dateType)){
            return new ResponseMsg<>();
        }
        // TODO 调用后台服务
        Object[] obj = statisticInfoService.unitDataStatSvc(startDate, endDate, instid, dateType);
        return ResponsePlugins.ok(obj);
    }
}

方法解析:

  • perform执行一个 RequestBuilder 请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;
  • get:声明发送一个get请求的方法。MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根据uri模板和uri变量值得到一个GET请求方式的。另外提供了其他的请求的方法,如:post、put、delete等。
  • param:添加request的参数,如上面发送请求的时候带上了了pcode = root的参数。假如使用需要发送json数据格式的时将不能使用这种方式,可见后面被@ResponseBody注解参数的解决方法
  • andExpect:添加ResultMatcher验证规则,验证控制器执行完成结果是否正确(对返回的数据进行的判断);
  • andDo:添加ResultHandler结果处理器,比如调试时打印结果到控制台(对返回的数据进行的判断);
  • andReturn:最后返回相应的MvcResult;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);

 

 友情提示:如果自己的测试类怎么也跑不通,请粘贴如上代码,稍加改动,跑起来在修改自己的!

 

你可能感兴趣的:(MockMvc,JUnit)