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

Spring Boot项目如何用Mockito为OkHttp编写单元测试并解决空指针问题

问题原因

你触发空指针的核心原因是链式打桩逻辑不符合Mockito的使用规则:httpClient.newCall()方法会返回okhttp3.Call类型的对象,你没有对这个返回值做Mock,调用时直接返回null,后续调用null的execute()方法自然触发空指针。

正确实现代码

修改后的完整测试代码如下:

@RunWith(MockitoJUnitRunner.class)
public class HStatusTest {
    
    @InjectMocks
    private HStatus hStatus;

    @Mock
    private OkHttpClient httpClient;
    // 新增Mock的Call对象,承接newCall方法的返回值
    @Mock
    private Call mockCall;


    @Test
    public void TestHCheck_Should_Return_200_StatusCode() throws URISyntaxException, IOException {

        Response resp = new Response.Builder()
                .request(new Request.Builder().url("SOME URL").build())
                .protocol(Protocol.HTTP_1_1)
                .code(200)
                .message("")
                // 关联Mock的Call,避免Response构造校验报错
                .call(mockCall)
                .build();

        // 分两步打桩,先定义newCall的返回值
        Mockito.when(httpClient.newCall(ArgumentMatchers.any(Request.class))).thenReturn(mockCall);
        // 再定义execute方法的返回值
        Mockito.when(mockCall.execute()).thenReturn(resp);

        int statusCode = hStatus.HCheck();
        
        assertEquals(200, statusCode);
    }
}
核心调整说明
  • 新增Call类型的Mock对象,解决newCall()方法返回null的问题
  • 拆分原有的链式打桩逻辑,先为httpClient.newCall打桩返回Mock的Call对象,再为Call.execute方法打桩返回预期的响应结果
  • 构造Response时补充call(mockCall)配置,兼容部分OkHttp版本的构造逻辑校验,避免额外报错

内容的提问来源于stack exchange,提问作者tiktok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:39:02