SpringMVC单元测试之MockMVC,模拟登录
在一些实际开发中,很多情况下需要对数据库进行操作,但是这里的操作就设计到用户权限,所谓权限验证就是拿到用户客户端登录后的token,在代码中进行校验,一般都是在controller层首先进行校验,如果校验成功,则执行之后操作,否则,采取相应措施,或者返回到登录界面或者错误界面,这里看业务需要。
但是我们都知道,实际项目中单元测试是必不可少的,尤其对controller层的接口进行逐个测试,需要的话,service层和mapper层(dao层)都是需要进行单元测试的。但是对于初次进行单元测试的人来说,可能会遇到一些小问题,就是按照之前的方式写代码,在test的方法中自定义参数,然后调用需要测试的方法,这个应该都没有问题吧,但是怎样拿到用户登录时的token呢?嘿,这里就用到了我们今天说的模拟登录了。下面我们看一下代码:
首先是controller层:
@PostMapping("/order")
public Result insert(@RequestBody Map<String, Object> map, HttpServletRequest request) {
//获得创建人id
Map<String, Object> create_or_update = CreateOrUpdateutil.getCreateOrUpdateUserId(request);
if (create_or_update == null) {
return ResultGenerator.getFailResult("请先登录");
}
map.put("create_or_update_user_id",(Integer)create_or_update.get("create_or_update_user_id"));
map.put("create_or_update_user_name",create_or_update.get("create_or_update_user_name").toString());
// 数据表字段为not null,暂时先添加上默认值
map.put("pre_order_id", "0");
map.put("req_start_date", "1970-01-01");
map.put("req_end_date", "1970-01-01");
Map<String, Object> data = corePlanOrderService.insert(map);
if (data != null && data.size() > 0) {
return ResultGenerator.getSuccessResult(data, "添加成功");
} else {
return ResultGenerator.getFailResult(new HashMap(), "添加失败");
}
}
这里看代码可以知道,
Map<String, Object> create_or_update = CreateOrUpdateutil.getCreateOrUpdateUserId(request);
这里是调用了一个方法,通过request获取到用户登录的token。然后进行验证,还有之后的操作。。。。
对这个接口进行测试,下面是测试代码:
private MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void insert() throws Exception{
Map<String, Object> map = new HashMap<>();
map.put("create_time", "2018-09-19 10:01:04");
map.put("num", 10);
map.put("req_org_name","org_name5");
map.put("pre_order_id", 1);
map.put("remark", "1");
map.put("req_end_date", "2018-09-21 00:00:00");
map.put("update_user_name","管理");
map.put("product_no", "产品no1");
map.put("product_name", "产品1");
map.put("order_code", "1111");
map.put("duty_user_id",1);
map.put("update_time", "2018-09-19 10:01:04");
map.put("product_type", "类型一");
map.put("update_user_id", 1);
map.put("is_temporary", 1);
map.put("plan_end_date","2018-09-17 00:00:00");
map.put("req_start_date", "2018-09-19 10:01:04");
map.put("plan_start_date","2018-09-17 00:00:00");
map.put("status", "1");
map.put("create_or_update_user_id",1);
map.put("create_or_update_user_name","dazhong");
ObjectMapper mapper = new ObjectMapper();
RequestBuilder request = MockMvcRequestBuilders.post("/order")
.content(mapper.writeValueAsString(map))
.header("Authorization",token)
.contentType(MediaType.APPLICATION_JSON_UTF8);
MvcResult result = mockMvc.perform(request)
.andReturn();
checkResponse(result);
}
通过RequestBuilder可以模拟用户登录,请求方式,路径,获取头部,内容,这里都可以模拟。模拟登录就可以模拟拿到用户登录的token,下面是提交完成之后进行的结果校验代码:
public class Tester {
protected String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbl9uYW1lIjoiaHJtXzIwMTgiLCJ1c2VyX25hbWUiOiLnrqHnkIYiLCJpZCI6MSwiZXhwIjoxNTM2OTk4MDM2fQ.VwxmI-jvrCQYiJP-N7VCSxkBHpPuPW3Fpf3E5CggsNU";
protected void checkResponse(MvcResult result) throws Exception {
int statusCode = result.getResponse().getStatus();
Assert.assertEquals(statusCode, 200);
String body = result.getResponse().getContentAsString();
Result res = JSON.parseObject(body, Result.class);
Assert.assertEquals(res.getSuccess(), true);
}
}
下面为了好理解,我们看一下PostMan中的头部是什么样的: