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,步骤如下:
- 在测试资源目录(
src/test/resources)下创建mockito-extensions文件夹 - 在该文件夹中创建文件
org.mockito.plugins.MockMaker,内容写入:mock-maker-inline
内容的提问来源于stack exchange,提问作者Johnyb
相关产品推荐
相关产品推荐

