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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:57:02