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中的头部是什么样的:

猜你喜欢

转载自blog.csdn.net/IBLiplus/article/details/82848472
今日推荐