Mock RestTemplate时postForEntity方法返回null该如何解决?
可按以下步骤排查解决:
1. 确认Mock注解生效
- 测试类必须搭配Mockito的启动注解,JUnit 5 需加:
JUnit 4 需加:@ExtendWith(MockitoExtension.class)
漏加该注解会导致@RunWith(MockitoJUnitRunner.class)@Mock标注的对象没有被初始化,桩设置不生效。
2. 修正ResponseEntity泛型匹配
你当前定义的返回对象泛型为ResponseEntity<Object>,和实际调用postForEntity时返回的ResponseEntity<ResponseVO>类型不匹配,Mockito会因泛型校验失败无法命中桩规则,修改为对应泛型即可:
// 把泛型从Object改为ResponseVO ResponseEntity<ResponseVO> resp = new ResponseEntity<>(respVO, HttpStatus.OK);
3. 确认Mock实例正确注入到目标类
- 需使用
@InjectMocks标注你要测试的业务类实例,确保业务类中依赖的RestTemplate就是你Mock出来的实例 - 禁止在业务类中手动
new RestTemplate(),否则Mock实例无法替换业务类中实际使用的对象,桩规则自然不生效
4. 验证参数匹配规则完全匹配方法签名
你调整后的参数匹配规则是正确的,确保没有匹配到其他重载的postForEntity方法即可:
when(restTemplate.postForEntity(anyString(), any(HttpEntity.class), eq(ResponseVO.class))).thenReturn(resp);
如以上配置都正确仍返回null,可换用Mockito的
doReturn写法绕开返回值校验:doReturn(resp).when(restTemplate).postForEntity(anyString(), any(HttpEntity.class), eq(ResponseVO.class));
内容的提问来源于stack exchange,提问作者Ori Marko
相关产品推荐
相关产品推荐

