如何正确Mock Keycloak中SimpleHttp.Response.asJson(Class<T> type)方法?
如何正确Mock Keycloak中SimpleHttp.Response.asJson(Class type)方法?
我来帮你解决这个Mock的问题,你遇到的错误主要是参数匹配器使用不当导致的,咱们一步步来修正:
问题根源分析
你之前尝试的两种写法都存在问题:
- 直接用
when(response.asJson(SampleResponse.class)).thenReturn(sampleResponse)时,Mockito的泛型推断逻辑容易出问题,加上SampleResponse.class是Class实例,需要配合精确匹配器来处理; - 用
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
相关产品推荐
相关产品推荐

