JUnit4 Mockito报错:期望调用的Mock方法未被调用求助
问题解决方案
1. 修正Repository方法名称
你的Service类中实际调用的是updateAllocationStatusByItemAndTenantId,但测试代码里验证的是updateAllocationStatusByDeptAndTenantId——方法名完全不匹配,这是Mockito报“未调用Mock”的直接原因。
修改测试中的验证代码,对齐Service中的方法名:
verify(itemAdditionalInfoRepository, times(1)) .updateAllocationStatusByItemAndTenantId( ItemSetupAllocationStatus.PROGRESS.getValue(), Integer.valueOf("200"), newIad.getLastUpdatedBy(), newIad.getLastUpdatedOn(), ConstantsUtil.tenantIdValueUS // Service中用的是方法参数tenantId,而非newIad.getTenantId() );
2. 修复测试类的注入冲突
测试类中同时给DecileConfigService标注了@Autowired和@InjectMocks,这会导致Spring容器管理的实例与Mockito创建的实例冲突。你需要二选一:
- 纯单元测试:去掉
@Autowired,仅保留@InjectMocks,让Mockito负责创建Service并注入Mock的Repository:@Mock ItemAdditionalInfoRepository itemAdditionalInfoRepository; @InjectMocks private DecileConfigService decileConfigService; - 依赖Spring上下文的测试:改用
@MockBean替换@Mock和@InjectMocks,让Mock的Repository注册到Spring容器,Spring管理的Service会自动使用该Mock:@MockBean ItemAdditionalInfoRepository itemAdditionalInfoRepository; @Autowired private DecileConfigService decileConfigService;
3. 确认参数一致性
Service调用Repository时使用的第5个参数是方法传入的tenantId(即ConstantsUtil.tenantIdValueUS),测试中请不要误用newIad.getTenantId()。另外要确认lastUpdatedBy和lastUpdatedOn的来源,确保测试验证的参数与实际调用完全一致。
4. 规避事务代理影响
由于triggerBatchJob方法标注了@Transactional,Spring会生成代理对象。纯单元测试中可临时禁用事务(比如添加@Transactional(propagation = Propagation.NOT_SUPPORTED)),避免代理干扰Mock的调用验证;如果必须保留事务,推荐使用@MockBean的注入方式,确保代理对象能正确使用Mock的Repository。
内容的提问来源于stack exchange,提问作者PAMPA ROY
相关产品推荐
相关产品推荐

