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

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方法。

解决方法

  1. 取消@Autowired private IProductService productService;的注释,确保Service能正常注入。
  2. 在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错误,无法提取有效响应体。

解决方法

  1. 调整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);
    }
}
  1. 确保测试请求的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:40:27