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

如何正确Mock Keycloak中SimpleHttp.Response.asJson(Class<T> type)方法?

如何正确Mock Keycloak中SimpleHttp.Response.asJson(Class type)方法?

我来帮你解决这个Mock的问题,你遇到的错误主要是参数匹配器使用不当导致的,咱们一步步来修正:

问题根源分析

你之前尝试的两种写法都存在问题:

  1. 直接用when(response.asJson(SampleResponse.class)).thenReturn(sampleResponse)时,Mockito的泛型推断逻辑容易出问题,加上SampleResponse.class是Class实例,需要配合精确匹配器来处理;
  2. 用when(response.asJson(any(SampleResponse.class)))完全搞错了匹配器的用法:any()方法里应该传入参数的类型,而不是具体的业务对象类型,这里asJson的参数是Class<T>类型,所以得用any(Class.class)或者eq(SampleResponse.class)来匹配。

正确的Mock写法

你只需要把Stub asJson方法的代码改成下面任意一种即可:

// 方式1:精确匹配指定的Class参数(推荐,更符合测试的严谨性)
when(response.asJson(eq(SampleResponse.class))).thenReturn(sampleResponse);

// 方式2:匹配任意Class类型的参数(如果不需要精确匹配特定Class的话)
when(response.asJson(any(Class.class))).thenReturn(sampleResponse);

修正后的完整测试代码

把你的测试类对应部分替换后,完整的测试代码如下:

class ClientTest {

    @Mock
    private KeycloakSession keycloakSession;
    
    @Mock
    private HttpClientProvider httpClientProvider;
    
    @Mock
    private CloseableHttpClient httpClient;
    
    @Mock
    private SimpleHttp simpleHttp;
    
    @Mock
    private SimpleHttp.Response response;
    
    private Client testClient;

    @BeforeEach
    void setUp() {
        when(keycloakSession.getProvider(HttpClientProvider.class)).thenReturn(httpClientProvider);
        when(httpClientProvider.getHttpClient()).thenReturn(httpClient);
        testClient = new Client(keycloakSession, "https://api.example.com", "BASIC", "user", "pass");
    }

    @Test
    void getCustomer_shouldReturnResponse_whenValidInputsProvided() throws Exception {
        try (MockedStatic<SimpleHttp> mockedSimpleHttp = mockStatic(SimpleHttp.class)) {
            // 静态Mock SimpleHttp.doGet方法
            mockedSimpleHttp.when(() -> SimpleHttp.doGet(eq("https://api.example.com/customer"), eq(httpClient)))
                    .thenReturn(simpleHttp);

            // Mock SimpleHttp的链式调用
            when(simpleHttp.param(anyString(), anyString())).thenReturn(simpleHttp);
            when(simpleHttp.json(null)).thenReturn(simpleHttp);
            when(simpleHttp.asResponse()).thenReturn(response);

            // Mock响应状态为200
            when(response.getStatus()).thenReturn(HttpStatus.SC_OK);

            // 构造预设的返回实例
            SampleResponse sampleResponse = new SampleResponse();
            // 可以给实例设置属性,方便后续断言验证
            sampleResponse.setCustomerInfo(new CustomerInfo("testName", "admin"));

            // 正确Stub目标方法
            when(response.asJson(eq(SampleResponse.class))).thenReturn(sampleResponse);

            // 调用被测方法
            SampleResponse result = testClient.getCustomer("client123");

            // 验证结果
            assertNotNull(result);
            assertEquals("testName", result.getCustomerInfo().getName());
            // 可选:验证asJson方法确实被调用了一次
            verify(response, times(1)).asJson(SampleResponse.class);
        }
    }
}

额外提示

  • 确保SampleResponse是标准POJO,具备对应的getter/setter方法(虽然Mock场景下不需要真正的反序列化,但类结构规范能避免潜在问题);
  • 如果你的测试不需要精确匹配SampleResponse.class,用any(Class.class)会更灵活,但推荐用eq(SampleResponse.class)来保证测试的严谨性。

备注:内容来源于stack exchange,提问作者blinkThrice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:03:01