c 视频播放网站开发,仿锤子 wordpress,网站开发服务商平台,青浦企业网站制作python web自动化测试设计构工具书40.9元包邮(需用券)去购买 错误正当我高高兴兴写完后台c层的测试代码准备提交时#xff0c;测试机器人报了很多401错误#xff0c;把代码拉下来一看#xff0c;原来当我写代码时#xff0c;我的伙伴已经写好后台的拦截器了#xff0c…python web自动化测试设计构工具书40.9元包邮(需用券)去购买 错误正当我高高兴兴写完后台c层的测试代码准备提交时测试机器人报了很多401错误把代码拉下来一看原来当我写代码时我的伙伴已经写好后台的拦截器了只有绑定了token的用户才能访问后台所以当我单元测试c层模拟请求时就会报错因为我的模拟前台请求就像是一个没有登陆的用户请求经过拦截器必然是被拦截了下来。解决经过一开始有点不知所错。我们的模拟请求失败是因为后台在没有绑定token的情况下请求了其他接口而我们的拦截器也没有发token给模拟请求。我们正常要使用系统的话要先登录第一次登录的话后台会发送一个token给前台并与用户绑定以后就会带着后台发来的token去请求。所以首先模拟一下正常的登录流程。创造一个方法loginUser()在方法上添加注释Before用于在每个测试方法前执行。在这个先新建一个用户用来当我们的模拟用户我们用这个用户的username和password来进行登录,然后在进行请求。Testpublic void loginUser() throws Exception{String url /user/login;String username RandomString.make(6);String password RandomString.make(6);JSONObject jsonObject new JSONObject();jsonObject.put(username, username);jsonObject.put(password, password);// 当以参数username, password调用userService.login方法时返回trueMockito.when(this.userService.login(username, password)).thenReturn(true);// 触发C层并断言返回值this.mockMvc.perform(MockMvcRequestBuilders.post(url).contentType(MediaType.APPLICATION_JSON_UTF8).content(jsonObject.toJSONString())).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().string(true));}但是两次模拟请求并不是同一个用户我们需要在第一次请求的时候获取token并保存用户在后续请求携带token发出模拟请求。这就需要引入request类。上述方法太麻烦了在学长的建议下研究拦截器原理发现拦截器通过isLogin()函数里判断token来判断这个用户是否登陆过如果把isLogin方法mock一下让他永远返回true就无论传什么token就都可以不被拦截了。Beforepublic void loginUser() throws Exception {Mockito.when(this.userService.isLogin(Mockito.any(String.class))).thenReturn(true);}但是只是在mock方法里规定传入string类型是不行的我们模拟请求默认token是null,所以我们应该在模拟请求时加入header的token信息随意一个字符串就好。this.mockMvc.perform(MockMvcRequestBuilders.get(url).header(auth-token, key).param(page, 1).param(size, 2)).andExpect(MockMvcResultMatchers.status().isOk());我们也可以在mock方法里设置传入任一参数都返回true这样我们就不用在后续模拟请求中发送token了。Beforepublic void loginUser() throws Exception {Mockito.when(this.userService.isLogin(Mockito.any())).thenReturn(true);}总结不断改进自己的解决办法从中学到更多解决问题的方法同时加深了对拦截器和token的了解。java 11官方入门(第8版)教材79.84元包邮(需用券)去购买