使用Mockito如何验证被测类自身的toDishResponseDTO方法是否被调用
问题根因
Mockito的
verify方法仅支持对mock或spy对象的调用行为做校验,你当前通过@InjectMocks注入的是DishService的普通真实实例,不属于mock/spy范畴,所以触发编译报错。
解决方案
使用Mockito的**Spy(部分模拟)**改造测试类中的dishService实例:Spy对象会执行类的真实方法,同时支持记录方法调用行为供verify校验,且可以和@InjectMocks组合使用自动注入依赖的mock对象。
代码修改示例
1. 测试类字段调整
@ExtendWith(MockitoExtension.class) class DishServiceTest { @Mock DishRepository dishRepository; @Mock RestaurantRepository restaurantRepository; // 替换原来的@Autowired+@InjectMocks,使用@Spy+@InjectMocks @Spy @InjectMocks DishService dishService; }
2. 测试用例调整
@Test void shouldCallFindAllReturnDto_whenV() { Mockito.when(dishRepository.findAll()).thenReturn(TestData.ENTITY_DISH); dishService.getAll(); Mockito.verify(dishRepository, times(1)).findAll(); // 修正语法错误(补充逗号),指定匹配的参数类型即可正常校验 Mockito.verify(dishService, times(6)).toDishResponseDTO(any(Dish.class)); }
注意事项
toDishResponseDTO方法不能是private、final、static修饰的,否则Mockito无法代理拦截该方法的调用,会导致校验失败- 如果你不需要强制校验方法调用次数,也可以直接断言
getAll()返回的DishResponseDTO列表的内容、长度符合预期,间接验证toDishResponseDTO的执行逻辑是否正确,这种方式更符合单元测试校验行为结果而非实现细节的设计原则
内容的提问来源于stack exchange,提问作者user15599360
相关产品推荐
相关产品推荐

