单元测试Service层需要登录的解决方案
背景
我们目前项目写单元测试,如果接口中没有使用到如下代码,我们直接调用service层即可实现单元测试。不需要做登录操作。
TzUser tzUser = SecurityUtils.getUser();
然而,现实是绝大多数情况下我们都需要使用到上诉语句和其他登录相关的信息。那么必须做登录才能单元测试,做了登录拿到token,通过在测试方法中手写post方法来发请求,来调用接口。
换句话说,我们单元测试的入口是controller层,而不是service层的接口。
问题:
如何不做登录就能直接测试service层 ? 还能正常获取到登录信息
解决方案
经过我看spring Security源码,找资料,结合我们的现有代码,我找到了一个方便,有效,安全的解决方案。
- 在单元测试的所在环境登录,直接在浏览器登录即可,这是为了保证
redis
中有你的账号信息 - 在你的测试类中,加上以下行代码即可。
@Autowired
private TzUserDetailsServiceImpl tzUserDetailsServiceImpl;
@Before
public void beforeMethodOfLogin() {
// 这个参数写你自己的登录用户名
UserDetails tzUser = tzUserDetailsServiceImpl.loadUserByUsername("wllim");
SecurityContextHolder.getContext().setAuthentication(
new TestingAuthenticationToken(tzUser, ""));
}
原理
关于2行代码的原理,需要spring Security有一定了解才能看懂,本文重点是如何使用,就不展开介绍了。