乐趣区

关于java:OAuth-20-单元测试解决方案

为什么须要单元测试

单元测试领有保障代码品质、尽早发现软件 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 模块
目前仅在 pig 2.10 做了实现,实践反对低版本,间接 install 此模块即可

退出移动版