OAuth 2.0 单元测试解决方案

为什么需要单元测试

单元测试拥有保证代码质量、尽早发现软件 Bug、简化调试过程、促进变化并简化集成、使流程更灵活等优势。单元测试是针对代码单元的独立测试,核心是“独立”,优势来源也是这种独立性,而所面临的不足也正是因为其独立性:既然是“独立”,就难以测试与其他代码和依赖环境的相互关系。单元测试与系统测试是互补而非代替关系。单元测试的优势,正是系统测试的不足,单元测试的不足,又恰是系统测试的优势。不能将单元测试当做解决所有问题的万金油,而需理解其优势与不足,扬长避短,与系统测试相辅相成,实现测试的最大效益。

OAuth2 系统单元测试困难

  • 接口测试依赖于 UPMS (用户权限管理),无法做到解耦独立

  • spring-security-test 模块未提供相关标准实现

  • 场景复杂既要包含无状态 token 调用,又要保证上线文传递业务

解决方案

参考 @WithMockUser ,在 Mock 拦截器中自动执行相关的增强(token 获取),并通过扩展 WithSecurityContextFactory 实现上下文 token 的传递。具体可以参考源码 pig-common-test[1]

引入依赖

1<dependency> 2 <groupId>com.pig4cloud</groupId> 3 <artifactId>pig-common-test</artifactId> 4 <version>${last.version}</version> 5 <scope>test</scope> 6</dependency>

单元测试 Controller 接口

  • 指定认证中心接口

    配置在 test/resources/application.yml security: oauth2: client: access-token-uri: http://pig-gateway:3000/oauth/token

  • 模拟测试 controller 接口

    @RunWith(SpringRunner.class) @SpringBootTest public class SysLogControllerTest {

    private MockMvc mvc;

    @Autowired private WebApplicationContext applicationContext; // 注入WebApplicationContext

    @Before public void setUp() { this.mvc = MockMvcBuilders.webAppContextSetup(applicationContext).build(); }

    @Test @SneakyThrows @WithMockOAuth2User public void testMvcToken() { mvc.perform(delete("/log/1").with(token())).andExpect(status().isOk()); } }

模拟测试 FeignClient 传递 token

直接注入 FeignClient 实现即可 使用 @WithMockOAuth2User 注解测试类即可

WithMockOAuth2User 属性说明

  • 当前用例获取 token 使用的用户名

    String username() default "admin";

  • 当前用例获取 token 使用的密码

    String password() default "123456";

写在最后 源码参考 pig-common-test 模块
目前仅在 pig 2.10 做了实现,理论支持低版本,直接 install 此模块即可

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java单元测试

Java单元测试1.概述java单元测试是最小的功能单元测试代码,单元测试就是针对单个java方法的测试。java程序的最小功能单元是方法。main方法进行测试的缺点:只能有一个main()方法,不能把测试代码分离出来无法打印出测试结果和期望结果.例如:expected:

高效易用的C++单元测试框架:轻松构建高质量代码

单元测试是构建稳定、高质量的程序、服务或系统的必不可少的一环。通过单元测试,我们可以在开发过程中及时发现和修复代码中的问题,提高代码的质量和可维护性。同时,单元测试也可以帮助我们更好地理解代码的功能和实现细节,从而更好地进行代码重构和优化。

云原生引擎单元测试实践

快速迭代的开发工作中如何提高代码质量一直是团队痛点,特别是没有测试支持的开发团队。合理的使用单元测试,并关注单元测试通过率、代码覆盖率可以有效提高代码质量。今天就来讲讲云原生引擎单元测试实践。

OAuth 2.0 单元测试解决方案 - HelloWorld