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

Mockito的doCallRealMethod在返回值为void的方法上不生效问题

问题:使用@Mock/@Spy注解时,无法触发void方法的真实逻辑

我尝试调用一个返回值为void的真实方法,分别给Bean加了@Mock和@Spy注解,但始终进不了实际类的方法逻辑。

业务代码

@Autowired private HelperV2 authValidationHelper;

@Override
public void postProcess(Event event) {
    List<Error> errorList = new ArrayList<>();
    authValidationHelper.validateOrderTotalAmount(event, errorList);
    handleError(event, errorList);
}

测试用例

@Spy private HelperV2 authValidationHelper;

@Test
public void test_postProcess()  {
    BaseOrderEvent event =
        ParserUtil.getObjectFromFile(
            "events/createPaymentRequestWithShoppingCardOnly2.json", Event.class);
    Mockito.doCallRealMethod()
        .when(authValidationHelper)
        .validateOrderTotalAmount(Mockito.any(), Mockito.any());
    createOrderEventProcessor.postProcess(event);
}

解决方案

  • 确保被测试类createOrderEventProcessor注入的是你定义的@Spy实例
    给测试类中的createOrderEventProcessor加上@InjectMocks注解,Mockito会自动把@Spy的authValidationHelper注入进去,避免Spring注入原始Bean导致Spy实例未被使用。

  • 确认doCallRealMethod()的语法正确
    对于void方法,必须使用doCallRealMethod().when(实例).方法名(...)的写法,不要用when(实例.方法名(...)).thenCallRealMethod()——后者会先执行一次目标方法,且可能导致真实逻辑未被正确触发。

  • 排查是否有冲突的Mock配置
    检查测试类中是否存在其他针对authValidationHelper的Mock设置(比如doNothing()),这些配置会覆盖doCallRealMethod()的规则,导致真实逻辑不执行。

  • 若使用Spring测试上下文,替换为@SpyBean
    如果测试类用了@SpringBootTest这类Spring注解,单纯的@Spy无法替换Spring容器中的Bean,此时改用@SpyBean注解,它会把Spy实例替换到容器中,确保被测试类能拿到这个Spy对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:10:49