如何对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存在,删除成功
测试逻辑:
- 构造模拟的Actor实例,对
actorRepository.findById打桩,返回包含该实例的Optional - 调用业务层
deleteActorById方法,传入对应ID - 验证
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不存在,抛出预期异常
测试逻辑:
- 对
actorRepository.findById打桩,返回空Optional - 调用业务方法,验证会抛出
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
相关产品推荐
相关产品推荐

