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

Mockito模拟WebClient.ResponseSpec.toEntity返回ResponseEntity编译报错

问题原因

Mockito完全支持模拟ResponseEntity,你遇到的编译错误和Mock能力无关,核心是方法返回值类型不匹配:
WebClient是Spring WebFlux提供的非阻塞响应式客户端,其ResponseSpec#toEntity(Class<T> bodyType)方法的返回值不是裸的ResponseEntity<T>,而是被响应式类型包装的Mono<ResponseEntity<T>>。你直接传入裸的ResponseEntity实例给thenReturn,编译器找不到对应参数类型的方法重载,自然会报无法解析方法的错误。
另外你贴的代码里ResponseEntity实例化那一行末尾多写了一个右括号,也会触发编译错误,记得一并修正。

可行修复方案

把待返回的ResponseEntity包装为Mono类型再传入thenReturn即可,修正后的测试代码如下:

import reactor.core.publisher.Mono;

@SpringBootTest
class TestClass {

    @Mock
    private WebClient.ResponseSpec responseMock;

    @Test
    public void testSampleMethod() {
        // responseStr为合法JSON字符串
        ResponseEntity<String> responseEntity = new ResponseEntity<>(responseStr, HttpStatus.OK);
        // 按toEntity方法的实际返回值类型包装为Mono
        when(responseMock.toEntity(String.class)).thenReturn(Mono.just(responseEntity));
        
        // 后续如果要拿存根的返回值做断言,记得通过block()订阅Mono拿到实际对象:
        // ResponseEntity<String> actualRes = responseMock.toEntity(String.class).block();
        // 再执行断言逻辑即可
    }
}
额外注意事项
  • 所有WebClient相关的方法存根都要注意返回值包装:bodyToMono返回Mono<T>、bodyToFlux返回Flux<T>、toEntityList返回Mono<ResponseEntity<List<T>>>,不要直接传入未包装的普通对象
  • 不推荐使用doReturn()绕开编译检查强制存根,这种写法会掩盖类型不匹配问题,测试运行时大概率抛出类型转换异常:
    // 不推荐的写法,仅作示例
    doReturn(Mono.just(responseEntity)).when(responseMock).toEntity(String.class);
    
  • 如果你测试的是Spring MVC非响应式场景的逻辑,使用RestTemplate时相关方法才会直接返回裸的ResponseEntity,这种场景下可以直接把ResponseEntity实例传给thenReturn,不需要额外包装。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:12:34