Mockito验证报错:未触发Mock交互及RestClientException问题排查
Spring Boot单元测试两类问题排查与解决
问题1:Mockito verify调用提示未与Mock交互
原因
- 测试方法
testProductDelete_02仅直接执行verify(productRepository).deleteById(any()),但未触发任何会调用productRepository.deleteById的业务流程——既没调用Controller的删除接口,也没调用Service的deleteProduct方法,导致Mock的Repository从未被执行。 - 测试类中
productService的注入被注释,无法通过Service触发Repository方法。
解决方法
- 取消
@Autowired private IProductService productService;的注释,确保Service能正常注入。 - 在verify操作前,先执行触发Repository调用的业务逻辑,比如调用Service方法或通过MockMvc调用Controller接口:
@Test public void testProductDelete_02() { // 方式1:调用Service触发Repository操作 productService.deleteProduct(101); // 方式2:用MockMvc调用Controller接口 // mockMvc.perform(MockMvcRequestBuilders.delete("/product/delete/101")); // 验证Repository方法是否被调用 verify(productRepository).deleteById(101); }
问题2:提取ProductDto类型响应错误
原因
- Controller的POST接口(
/product/register)返回的是ResponseEntity<String>类型(如"110-Removed"),但测试中用ResponseEntity<ProductDto>接收,类型不匹配导致转换失败。 - 测试请求的URL可能与Controller的路径不匹配,导致返回404错误,无法提取有效响应体。
解决方法
- 调整Controller接口的返回类型:如果需要返回ProductDto,修改方法逻辑返回实体转换后的DTO:
@RestController @RequestMapping("/product") public class EmployeeRestController { @Autowired private IProductService service; @PostMapping("/register") public ResponseEntity<ProductDto> saveProduct(@RequestBody ProductDto productDto) { Product savedProduct = service.saveProduct(productDto); // 实现Product到ProductDto的转换逻辑 ProductDto responseDto = new ProductDto(savedProduct.getId(), savedProduct.getName(), savedProduct.getPrice(), savedProduct.getVersion()); return new ResponseEntity<>(responseDto, HttpStatus.OK); } }
- 确保测试请求的URL与Controller路径一致,同时调整测试代码的响应接收类型:
@Test public void testProductSave_01() throws Exception { ProductDto productDTO = givenProductDto(); // 拼接正确的接口路径:/product/register String format = String.format(URL + "register", port); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("Content-Type", "application/json;charset=UTF-8"); HttpEntity<ProductDto> httpEntity = new HttpEntity<>(productDTO, httpHeaders); ResponseEntity<ProductDto> response = restTemplate.exchange( format, HttpMethod.POST, httpEntity, ProductDto.class ); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); assertEquals(productDTO.getName(), response.getBody().getName()); }
内容的提问来源于stack exchange,提问作者Ankush Bandu Kamble
相关产品推荐
相关产品推荐

