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

