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

如何对Spring Boot中返回void的delete方法进行Mockito单元测试断言

问题分析与解决方案

你现有代码存在3个核心错误,是导致编译报错和测试逻辑不正确的原因:

  • 错误1:待测试的deleteActorById是void返回类型,不会返回任何值,所以完全不能用assertEquals接收它的执行结果做断言,这是编译报错的直接原因。
  • 错误2:thenReturn(Optional.of(Mockito.any(Actor.class)))写法错误,Mockito.any()系列是参数匹配器,仅用于匹配Mock对象方法调用时的入参,不能作为返回值构造的内容。
  • 错误3:调用业务方法service.deleteActorById(Mockito.anyLong())写法错误,实际执行测试方法调用时必须传入具体参数,不能使用参数匹配器,参数匹配器仅用于打桩(when)和交互验证(verify)场景。

正确测试实现思路

返回void的业务方法,单元测试核心是验证方法的交互行为符合预期,不需要对返回值做断言,分两种常见测试场景:

场景1:ID存在,删除成功

测试逻辑:

  1. 构造模拟的Actor实例,对actorRepository.findById打桩,返回包含该实例的Optional
  2. 调用业务层deleteActorById方法,传入对应ID
  3. 验证actorRepository.delete方法确实被调用,且传入的参数就是我们之前构造的Actor实例

代码示例:

@Test
public void testDeleteActorSuccess() throws NetflixException {
    // 1. 构造测试数据与打桩
    Actor mockActor = Mockito.mock(Actor.class);
    when(actorRepository.findById(1L)).thenReturn(Optional.of(mockActor));

    // 2. 执行待测试方法
    service.deleteActorById(1L);

    // 3. 验证交互:确认delete方法被调用,且参数是对应的mockActor
    verify(actorRepository, times(1)).delete(mockActor);
}

场景2:ID不存在,抛出预期异常

测试逻辑:

  1. 对actorRepository.findById打桩,返回空Optional
  2. 调用业务方法,验证会抛出NotFoundException且异常信息符合预期

代码示例(JUnit5写法):

@Test
public void testDeleteActorNotFound() {
    // 1. 打桩:ID不存在时返回空Optional
    when(actorRepository.findById(2L)).thenReturn(Optional.empty());

    // 2. 验证抛出预期异常
    NotFoundException exception = assertThrows(NotFoundException.class, 
        () -> service.deleteActorById(2L));
    
    assertEquals("Actor id not found - 2", exception.getMessage());
    // 同时验证delete方法从未被调用
    verify(actorRepository, never()).delete(any());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:21:02