如何用Mockito模拟JWT?Quarkus控制器测试问题求助
Quarkus控制器测试问题解决方案
问题1:静态方法Mock报错的解决
你遇到的"You cannot use argument matchers outside of verification or stubbing."错误,是因为Mockito的普通when()无法处理静态方法的Mock。要Mock静态类的方法,必须使用MockedStatic,并且通过try-with-resources块管理,确保Mock能被正确清理,避免影响其他测试。
修改后的测试代码示例:
@Test public void testGetUsers() { try (MockedStatic<AuthorizationHelper> mockedHelper = Mockito.mockStatic(AuthorizationHelper.class)) { // 指定静态方法的Mock行为 mockedHelper.when(() -> AuthorizationHelper.checkJwt(Mockito.any(JsonWebToken.class))) .thenReturn(true); given() .when().get("/api/v1/users") .then() .statusCode(200); } }
问题2:SecurityContext模拟返回JWT的正确方式
你之前模拟SecurityContext时getPrincipal()返回null,大概率是因为没有正确注入Mock或未设置好Mock行为。在Quarkus测试中,推荐用@InjectMock注入SecurityContext的Mock实例,再指定它返回你需要的JsonWebToken:
@QuarkusTest class YourControllerTest { @InjectMock SecurityContext securityContext; @Test public void testGetUsers() { // 模拟一个JWT实例并设置name属性 JsonWebToken mockJwt = Mockito.mock(JsonWebToken.class); Mockito.when(mockJwt.getName()).thenReturn("test-user"); // 让SecurityContext返回这个模拟的JWT Mockito.when(securityContext.getUserPrincipal()).thenReturn(mockJwt); given() .when().get("/api/v1/users") .then() .statusCode(200); } }
更简便的Quarkus测试方案
如果你使用Quarkus的JWT安全扩展,完全可以用@TestSecurity注解直接模拟认证用户,无需手动Mock SecurityContext和JWT,代码更简洁:
@QuarkusTest class YourControllerTest { @Test @TestSecurity(user = "test-user") public void testGetUsers() { given() .when().get("/api/v1/users") .then() .statusCode(200); } }
这个注解会自动初始化合法的SecurityContext和JsonWebToken,完全满足你的校验逻辑。
内容的提问来源于stack exchange,提问作者wilt868
相关产品推荐
相关产品推荐

