You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:40:25