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

Mock ApacheHttp类时出现空指针异常(NPE)的原因

问题原因及解决办法

常见原因1:未将Mock实例注入到被测试类

如果你的ElasticSearchLogger类依赖CloseableHttpClient,但测试中仅创建了Mock对象却未将其注入到被测试实例中,被测试类里的CloseableHttpClient会保持null状态,调用其方法时直接触发NPE。

解决方式:

  • 若使用构造函数注入:在测试类中创建被测试实例时传入Mock的client
    @ExtendWith(MockitoExtension.class)
    @MockitoSettings(strictness = Strictness.LENIENT)
    class ElasticSearchLoggerTest {
        @Mock
        private CloseableHttpClient client;
        @Mock
        private CloseableHttpResponse response;
        
        // 被测试类实例,注入Mock的client
        private ElasticSearchLogger logger;
    
        @BeforeEach
        public void setUp() {
            logger = new ElasticSearchLogger(client);
        }
    }
    
  • 若使用Setter注入:在setUp中调用Setter方法传入Mock对象

常见原因2:未对Mock方法调用进行打桩

当调用client.execute()等方法时,若未指定返回Mock的response,Mockito默认会返回null,后续操作response的方法(比如获取状态码、实体)时就会触发NPE。

解决方式:
在setUp或测试方法中对目标方法打桩:

@BeforeEach
public void setUp() throws IOException {
    response = Mockito.mock(CloseableHttpResponse.class);
    client = Mockito.mock(CloseableHttpClient.class);
    // 打桩:当client执行请求时返回mock的response
    Mockito.when(client.execute(Mockito.any(HttpUriRequest.class))).thenReturn(response);
    // 若需要操作response的内容,继续打桩,比如状态码
    Mockito.when(response.getStatusLine()).thenReturn(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK"));
}

常见原因3:Mockito无法Mock目标类(针对final类/方法)

虽然CloseableHttpClient是抽象类,但如果你的代码实际依赖的是它的final实现类(比如InternalHttpClient),或者调用的是final方法,Mockito默认无法Mock这类对象,会导致Mock实例无效,调用时触发NPE。

解决方式:
启用Mockito的Inline Mock Maker,步骤如下:

  1. 在测试资源目录(src/test/resources)下创建mockito-extensions文件夹
  2. 在该文件夹中创建文件org.mockito.plugins.MockMaker,内容写入:
    mock-maker-inline
    

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

相关产品推荐
方舟 Agent Plan

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

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