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
相关产品推荐
相关产品推荐

