Java WebClient Mock无效排查:为何未返回预期响应?
问题分析与解决步骤
1. 断言逻辑错误
你的测试断言存在明显错误:assertEquals(Mono.just("response"), response);
- 服务方法
getResponse返回的是block()后的字符串结果,而非Mono对象。 - 修正断言代码:
assertEquals("response", response);
2. Mock参数匹配失效(核心问题)
返回HTML说明你的Mock逻辑未命中,服务实际发起了真实HTTP请求(大概率是请求失败后的默认错误页面)。问题出在BodyInserters.fromValue(requestBody)的参数匹配环节:
- 即便
requestBody是字符串,也可能因测试传入的实例与服务内使用的实例引用/值存在细微差异,导致Mock不生效。 - 解决方法:改用参数匹配器确保Mock命中:
// 匹配任意BodyInserter实例,适合无需精准校验请求体的场景 when(requestBodyUriMock.body(any(BodyInserter.class))).thenReturn(requestHeadersMock); // 若需要精准匹配请求体内容,使用eq匹配器 // when(requestBodyUriMock.body(eq(BodyInserters.fromValue(requestBody)))).thenReturn(requestHeadersMock);
3. 验证Mock对象注入有效性
确认webClientMock已正确注入到someServiceSpy中,服务类内部没有新建WebClient实例(比如直接调用WebClient.create()),否则Mock对象不会被实际使用。
4. 排查错误处理分支
临时在doOnError中添加日志或断点,确认是否进入了异常处理分支。如果进入,说明Mock未生效时发起的真实请求出现了错误,返回了HTML错误页。
内容的提问来源于stack exchange,提问作者Meilan
相关产品推荐
相关产品推荐

