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

