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
相关产品推荐
相关产品推荐

