前后端分离以后,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<String, Object> 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<Object[]> goUnitDataStatSvc(HttpServletRequest request, @RequestBody Map<String,Object> 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;然后进行自定义验证/进行下一步的异步处理(对返回的数据进行的判断);
友情提示:如果自己的测试类怎么也跑不通,请粘贴如上代码,稍加改动,跑起来在修改自己的!