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

Spring Boot删除接口测试始终失败,抛出EntityNotFoundException异常

问题原因

测试失败的核心原因是:控制器的delete方法会先调用appUserService.findById(id)检查记录是否存在,但你在测试中只Mock了deleteById方法,没有MockfindById方法。Mockito对未指定行为的Mock方法会返回默认值(Optional类型默认返回empty),所以findById(1L)返回空,直接触发了EntityNotFoundException,导致测试失败。

修复方案

在测试方法中添加对findById方法的Mock,让它返回非空的Optional,模拟数据库中存在该记录的场景。修改后的测试代码如下:

@Test
public void delete() throws Exception {
    // Mock findById 返回存在的用户实体(替换为你的实际AppUser构造逻辑)
    Mockito.when(appuserService.findById(ArgumentMatchers.eq(1L)))
           .thenReturn(Optional.of(new AppUser()));
    
    // Mock deleteById 无操作
    Mockito.doNothing().when(appuserService).deleteById(ArgumentMatchers.eq(1L));
    
    mockMvc.perform(
                    MockMvcRequestBuilders.delete(ENDPOINT_URL + "/" + 1L))
            .andExpect(MockMvcResultMatchers.status().isOk());
    
    // 验证方法调用次数
    Mockito.verify(appuserService, Mockito.times(1)).findById(ArgumentMatchers.eq(1L));
    Mockito.verify(appuserService, Mockito.times(1)).deleteById(ArgumentMatchers.eq(1L));
    Mockito.verifyNoMoreInteractions(appuserService);
}
额外建议
  1. 若要测试记录不存在时抛出异常的场景,可以单独编写测试方法:MockfindById返回empty,然后断言响应状态为404(或你自定义的异常对应状态码)。
  2. 使用ArgumentMatchers.eq(1L)替代anyLong(),可以让测试验证更精准,确保是针对特定ID的方法调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:25:24