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

Spring+Mockito测试中Service未调用Mock Repository方法的问题

问题诊断与解决方案

问题出在测试类中的重复初始化Mock实例:
你已经使用@ExtendWith(MockitoExtension.class)注解,该注解会自动初始化所有标注@Mock、@InjectMocks的字段并完成依赖注入。但你又在@BeforeEach的setUpMocks方法里调用了MockitoAnnotations.openMocks(this),这会重新初始化Mock,导致你之前通过when(itemRepository.findByItemNameIgnoreCase(any())).thenReturn(Optional.of(item))设置的Stub被清空,ItemService实际使用的是重置后的ItemRepository Mock,自然不会触发预期返回值,也无法被verify检测到交互。

具体修改步骤

直接删除setUpMocks方法中的MockitoAnnotations.openMocks(this)调用:

@BeforeEach
void setUpMocks() {
    input = new MockItem();
    // 移除该行:MockitoAnnotations.openMocks(this);
}

补充验证建议

修改后,可在测试方法末尾添加verify验证,确保Repository方法确实被调用:

// 验证Repository方法以data中的itemName为参数被调用
verify(itemRepository).findByItemNameIgnoreCase(data.itemName());

修改完成后,itemRepository.findByItemNameIgnoreCase会返回预设的Optional.of(item),触发Service中的if判断并抛出ItemAlreadyCreatedException,测试即可正常通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 21:41:11