OAuth 2.0 单元测试解决方案

简介: 解决 spring security oauth2 测试困难的问题

为什么需要单元测试

单元测试拥有保证代码质量、尽早发现软件 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 2.10 做了实现,理论支持低版本,直接 install 此模块即可

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注
目录
相关文章
|
JSON Dubbo 测试技术
junit5单元测试自动生成最佳实践
在对比了几款插件后,最终选择了重新打造一套适合自己的插件。参看:【谈一谈单元测试】插件安装本地安装[文件: jcode5-1.0-SNAPSHOT.zip] 请在PC端预览或下载idea插件市场下载,搜索JCode5            插件使用插件有三个功能生成测试代码,也就是生成单元测试。生成json数据,通常用来生成测试数据,比如model。用来参数化测试。增加测试方法,随着业务开发,类可
2419 0
junit5单元测试自动生成最佳实践
|
24天前
|
Java 测试技术 Maven
开发指南067-单元测试
平台中单元测试使用两个工具:
|
3月前
|
存储 SQL 测试技术
单元测试问题之JCode5插件在项目中的实际应用效果如何解决
单元测试问题之JCode5插件在项目中的实际应用效果如何解决
80 3
|
3月前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
59 0
|
4月前
|
Devops jenkins 测试技术
如何在Visual Basic项目中实施单元测试以确保代码健壮性
【7月更文挑战第2天】本文探讨了如何在Visual Basic项目中实施单元测试以确保代码健壮性。单元测试基础包括验证代码单元的功能,促进重构和提高代码质量。MSTest、NUnit和xUnit是VB.NET的单元测试工具。遵循TDD原则,保持测试独立,关注单一功能,并确保快速执行。示例展示了如何为`Calculator`类的加法方法编写MSTest。持续集成与自动化测试工具如Jenkins和Azure DevOps辅助测试运行和代码质量检查。单元测试是提升软件质量和开发效率的关键实践,反映了良好的开发文化。
53 2
|
6月前
|
Java 测试技术 开发者
卓越工程之单元测试在行权鉴权中的实践
这篇文章着重在“实践”上,是对Java编程技巧之单元测试用例编写流程这篇文章的实际应用,并没有高深的理论和技术。
|
6月前
|
缓存 自动驾驶 测试技术
如何进行有效的Apollo测试:单元测试和集成测试指南
如何进行有效的Apollo测试:单元测试和集成测试指南
185 13
|
6月前
|
缓存 测试技术 持续交付
工程化测试:Apollo的单元测试与集成测试指南
工程化测试:Apollo的单元测试与集成测试指南
|
存储 Java 测试技术
【C#编程最佳实践 一】单元测试实践
【C#编程最佳实践 一】单元测试实践
113 0
|
JSON Java 测试技术
《Java单元测试实战》——单测认证:单元测试认证问题、答案和解析(上)
《Java单元测试实战》——单测认证:单元测试认证问题、答案和解析(上)
560 0