单元测试如何模拟用户请求

错误:
正当我高高兴兴写完后台c层的测试代码准备提交时,测试机器人报了很多401错误,把代码拉下来一看,原来当我写代码时,我的伙伴已经写好后台的拦截器了,只有绑定了token的用户才能访问后台,所以当我单元测试c层模拟请求时就会报错,
在这里插入图片描述
因为我的模拟前台请求就像是一个没有登陆的用户请求,经过拦截器必然是被拦截了下来。
在这里插入图片描述
解决经过
一开始有点不知所错。我们的模拟请求失败是因为后台在没有绑定token的情况下请求了其他接口,而我们的拦截器也没有发token给模拟请求。我们正常要使用系统的话要先登录,第一次登录的话后台会发送一个token给前台并与用户绑定,以后就会带着后台发来的token去请求。

所以首先模拟一下正常的登录流程。创造一个方法 loginUser() ,在方法上添加注释 @Before ,用于在每个测试方法前执行。在这个先新建一个用户用来当我们的模拟用户,我们用这个用户的username和password来进行登录,然后在进行请求。

@Test
    public 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方法时,返回true
        Mockito.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就都可以不被拦截了。

@Before
    public 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了。

@Before
   public void loginUser() throws Exception {

     Mockito.when(this.userService.isLogin(Mockito.any())).thenReturn(true);
   }

总结
不断改进自己的解决办法,从中学到更多解决问题的方法,同时加深了对拦截器和token的了解。

加入我们!!群,642830685,领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Asaasa1/article/details/107406503