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

Mock WebClient调用时.body方法模拟失败,抛出空指针异常求助

WebClient Mock时.body()方法抛出NullPointerException的解决方法

你的NPE问题出在WebClient调用链的Mock逻辑不匹配,具体问题点:

  • 业务代码中,uri()返回的RequestBodySpec调用headers()后,你没有Mock这个方法的返回值,导致返回null,后续调用body()时自然抛出空指针。
  • 测试代码中错误使用了未关联的requestHeadersMock对象,完全没覆盖到业务代码里的headers()调用。

修正后的测试代码

首先确保所有Mock对象正确初始化(以Mockito为例):

// 初始化所需的Mock对象
@Mock
private WebClient webClient;
@Mock
private WebClient webclientnoproxy; // 业务代码中用到的第二个WebClient也要Mock
@Mock
private RequestBodyUriSpec requestBodyUriMock;
@Mock
private RequestBodySpec requestBodySpecMock;
@Mock
private RequestHeadersSpec<?> requestHeadersSpecMock;
@Mock
private ResponseSpec responseSpec;

然后严格按照业务代码的调用链设置Mock返回:

// 第一个WebClient的调用链Mock
when(webClient.post()).thenReturn(requestBodyUriMock);
when(requestBodyUriMock.uri(anyString())).thenReturn(requestBodySpecMock);
// 关键:RequestBodySpec的headers()调用后返回自身,必须Mock这一步
when(requestBodySpecMock.headers(any(Consumer.class))).thenReturn(requestBodySpecMock);
// Mock body()方法返回RequestHeadersSpec
when(requestBodySpecMock.body(any(BodyInserter.class))).thenReturn(requestHeadersSpecMock);
when(requestHeadersSpecMock.retrieve()).thenReturn(responseSpec);
when(responseSpec.bodyToMono(JsonNode.class)).thenReturn(monoJson);

// 补充第二个WebClient的调用链Mock(否则flatMap内的代码会报错)
RequestBodyUriSpec noproxyRequestBodyUriMock = Mockito.mock(RequestBodyUriSpec.class);
RequestBodySpec noproxyRequestBodySpecMock = Mockito.mock(RequestBodySpec.class);
RequestHeadersSpec<?> noproxyRequestHeadersSpecMock = Mockito.mock(RequestHeadersSpec.class);
ResponseSpec noproxyResponseSpec = Mockito.mock(ResponseSpec.class);

when(webclientnoproxy.post()).thenReturn(noproxyRequestBodyUriMock);
when(noproxyRequestBodyUriMock.uri(anyString())).thenReturn(noproxyRequestBodySpecMock);
when(noproxyRequestBodySpecMock.headers(any(Consumer.class))).thenReturn(noproxyRequestBodySpecMock);
when(noproxyRequestBodySpecMock.body(any(BodyInserter.class))).thenReturn(noproxyRequestHeadersSpecMock);
when(noproxyRequestHeadersSpecMock.retrieve()).thenReturn(noproxyResponseSpec);
// 根据测试需求设置返回值
when(noproxyResponseSpec.onStatus(any(), any())).thenReturn(noproxyResponseSpec);
when(noproxyResponseSpec.bodyToMono(String.class)).thenReturn(Mono.just("mock-response"));

额外检查点

  • 确认测试时传入的data参数不为null,BodyInserters.fromFormData(data)接收null会直接抛出NPE。
  • 确保使用的any()等匹配器来自org.mockito.ArgumentMatchers包,避免包冲突导致匹配失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:33:12