Spring OAuth2.0 单元测试解决方案
为什么需要单元测试
单元测试拥有保证代码质量、尽早发现软件Bug、简化调试过程、促进变化并简化集成、使流程更灵活等优势。单元测试是针对代码单元的独立测试,核心是“独立”,优势来源也是这种独立性,而所面临的不足也正是因为其独立性:既然是“独立”,就难以测试与其他代码和依赖环境的相互关系。单元测试与系统测试是互补而非代替关系。单元测试的优势,正是系统测试的不足,单元测试的不足,又恰是系统测试的优势。不能将单元测试当做解决所有问题的万金油,而需理解其优势与不足,扬长避短,与系统测试相辅相成,实现测试的最大效益。
OAuth2系统单元测试困难
- 接口测试依赖于UPMS(用户权限管理),无法做到解耦独立
- spring-security-test模块未提供相关标准实现
- 场景复杂既要包含无状态token调用,又要保证上线文传递业务
解决方案
参考@WithMockUser,在Mock拦截器中自动执行相关的增强(token获取),并通过扩展WithSecurityContextFactory实现上下文token的传递。具体可以参考源码pig-common-test[1]
引入依赖
com.pig4cloud pig-common-test ${last.version} test
单元测试Controller接口
指定认证中心接口
配置在test/resources/application.yml
security: oauth2: client: access-token-uri:http://pig-gateway:3000/oauth/token
模拟测试controller接口
@RunWith(SpringRunner.class) @SpringBootTest publicclassSysLogControllerTest{ privateMockMvcmvc; @Autowired privateWebApplicationContextapplicationContext;//注入WebApplicationContext @Before publicvoidsetUp(){ this.mvc=MockMvcBuilders.webAppContextSetup(applicationContext).build(); } @Test @SneakyThrows @WithMockOAuth2User publicvoidtestMvcToken(){ mvc.perform(delete("/log/1").with(token())).andExpect(status().isOk()); } }
模拟测试FeignClient传递token
直接注入FeignClient实现即可使用@WithMockOAuth2User注解测试类即可
WithMockOAuth2User属性说明
当前用例获取token使用的用户名
Stringusername()default"admin";
当前用例获取token使用的密码
Stringpassword()default"123456";
写在最后
源码参考pig-common-test[1]模块
目前仅在pig2.10做了实现,理论支持低版本,直接install此模块即可
参考资料
[1]pig-common-test:https://gitee.com/log4j/pig/tree/master/pig-common/pig-common-test
到此这篇关于SpringOAuth2.0单元测试解决方案的文章就介绍到这了,更多相关SpringOAuth2.0单元测试内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!