Spring OAuth2.0 单元测试解决方案

 更新时间:2020年10月12日 11:52:57   作者:冷冷zz  
这篇文章主要介绍了Spring OAuth2.0 单元测试解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

为什么需要单元测试

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

OAuth2 系统单元测试困难

  • 接口测试依赖于 UPMS (用户权限管理),无法做到解耦独立
  • spring-security-test 模块未提供相关标准实现
  • 场景复杂既要包含无状态 token 调用,又要保证上线文传递业务

解决方案

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

引入依赖

<dependency>
 <groupId>com.pig4cloud</groupId>
 <artifactId>pig-common-test</artifactId>
 <version>${last.version}</version>
 <scope>test</scope>
</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[1] 模块

目前仅在 pig 2.10 做了实现,理论支持低版本,直接 install 此模块即可

参考资料

[1] pig-common-test: https://gitee.com/log4j/pig/tree/master/pig-common/pig-common-test

到此这篇关于Spring OAuth2.0 单元测试解决方案的文章就介绍到这了,更多相关Spring OAuth2.0 单元测试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Mybatis-Plus之ID自动增长的设置实现

    Mybatis-Plus之ID自动增长的设置实现

    本文主要介绍了Mybatis-Plus之ID自动增长的设置实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java 数据结构与算法系列精讲之时间复杂度与空间复杂度

    Java 数据结构与算法系列精讲之时间复杂度与空间复杂度

    对于一个算法,其时间复杂度和空间复杂度往往是相互影响的,当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间,这篇文章主要给大家介绍了关于Java时间复杂度、空间复杂度的相关资料,需要的朋友可以参考下
    2022-02-02
  • Spring Boot使用MyBatis进行两个表的关联

    Spring Boot使用MyBatis进行两个表的关联

    本文主要介绍了Spring Boot使用MyBatis进行两个表的关联,通过实例演示了如何使用MyBatis的XML映射文件和注解实现关联操作,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • SpringBoot打印系统执行的sql语句及日志配置指南

    SpringBoot打印系统执行的sql语句及日志配置指南

    这篇文章主要给大家介绍了关于SpringBoot打印系统执行的sql语句及日志配置的相关资料,在Java SpringBoot项目中如果使用了Mybatis框架,默认情况下执行的所有SQL操作都不会打印日志,需要的朋友可以参考下
    2023-10-10
  • Spring-Smart-DI 动态切换实现类的步骤

    Spring-Smart-DI 动态切换实现类的步骤

    文章介绍了如何使用spring-smart-di的@AutowiredProxySPI注解来实现动态切换服务提供商的功能,通过配置点和代理对象,实现动态切换而无需重启服务,感兴趣的朋友一起看看吧
    2025-03-03
  • Java中Long类型传入前端数值出错问题

    Java中Long类型传入前端数值出错问题

    这篇文章主要介绍了Java中Long类型传入前端数值出错问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Spring Data Redis对象缓存序列化问题解决

    Spring Data Redis对象缓存序列化问题解决

    相信在项目中,你一定是经常使用Redis,在使用时,有没有遇到同我一样,对象缓存序列化问题的呢,本文主要介绍了Spring Data Redis对象缓存序列化问题解决,感兴趣的可以了解一下
    2024-01-01
  • Spring Boot 中该如何防御计时攻击

    Spring Boot 中该如何防御计时攻击

    这篇文章主要介绍了Spring Boot 中该如何防御计时攻击,帮助大家更好的使用spring boot框架,感兴趣的朋友可以了解下
    2020-09-09
  • MyBatis-Plus集成Druid环境搭建的详细教程

    MyBatis-Plus集成Druid环境搭建的详细教程

    这篇文章主要介绍了MyBatis-Plus集成Druid环境搭建的详细教程,需要的朋友可以参考下
    2020-08-08
  • SpringMVC+Mysql实例详解(附demo)

    SpringMVC+Mysql实例详解(附demo)

    本篇文章主要介绍了SpringMVC+Mysql实例详解(附demo),小编觉得挺不错的,现在分享给大家,也给大家做个参考。
    2016-12-12

最新评论