单元测试Service层需要登录的解决方案

单元测试Service层需要登录的解决方案

背景

我们目前项目写单元测试,如果接口中没有使用到如下代码,我们直接调用service层即可实现单元测试。不需要做登录操作。

TzUser tzUser = SecurityUtils.getUser();

然而,现实是绝大多数情况下我们都需要使用到上诉语句和其他登录相关的信息。那么必须做登录才能单元测试,做了登录拿到token,通过在测试方法中手写post方法来发请求,来调用接口。

换句话说,我们单元测试的入口是controller层,而不是service层的接口。

问题:

如何不做登录就能直接测试service层 ? 还能正常获取到登录信息

解决方案

经过我看spring Security源码,找资料,结合我们的现有代码,我找到了一个方便,有效,安全的解决方案。

  1. 在单元测试的所在环境登录,直接在浏览器登录即可,这是为了保证redis中有你的账号信息
  2. 在你的测试类中,加上以下行代码即可。
 @Autowired
 private TzUserDetailsServiceImpl tzUserDetailsServiceImpl;

@Before
public void beforeMethodOfLogin() {
    // 这个参数写你自己的登录用户名
    UserDetails tzUser = tzUserDetailsServiceImpl.loadUserByUsername("wllim");
    SecurityContextHolder.getContext().setAuthentication(
        new TestingAuthenticationToken(tzUser, ""));
}

原理

关于2行代码的原理,需要spring Security有一定了解才能看懂,本文重点是如何使用,就不展开介绍了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值