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

Mockito:如何在@Spy对象调用真实方法后执行自定义方法?

实现先调用真实方法再执行自定义逻辑的Mockito配置

嘿,这个需求我刚好处理过,分两种场景给你讲清楚怎么实现:


场景1:每次调用都先执行真实方法,再触发自定义逻辑

如果你的目标是每一次调用send()方法时,都先跑真实的业务逻辑,紧接着执行自定义方法,那不能直接用thenCallRealMethod().thenXXX()的链式写法(因为链式默认对应不同调用次数的行为),得把两个逻辑合并到同一个Answer中:

代码示例

// 假设你的自定义方法是myCustomMethod(),可以这样配置
when(emailClientService.send(any())).thenAnswer(invocation -> {
    // 第一步:执行真实的send方法
    Object realMethodResult = invocation.callRealMethod();
    
    // 第二步:执行你的自定义逻辑
    myCustomMethod();
    
    // 返回真实方法的结果(如果send方法有返回值,记得对应类型)
    return realMethodResult;
});

关键细节

  • invocation.callRealMethod():这是Mockito提供的核心方法,用来触发Mock对象的真实方法执行,它会返回真实方法的返回值,你可以根据业务需求处理或直接返回。
  • 如果自定义方法需要用到send()的入参,还可以通过invocation.getArguments()获取:
    when(emailClientService.send(any())).thenAnswer(invocation -> {
        // 获取send方法的参数(假设第一个参数是邮件内容字符串)
        String emailContent = (String) invocation.getArguments()[0];
        
        // 执行真实方法
        Object realResult = invocation.callRealMethod();
        
        // 带参数的自定义方法调用
        myCustomMethod(emailContent);
        
        return realResult;
    });
    

场景2:第一次调用走真实方法,后续调用走自定义逻辑

如果你其实是想第一次调用执行真实方法,第二次及以后的调用只执行自定义逻辑,那可以直接用Mockito的链式调用语法:

代码示例

when(emailClientService.send(any()))
    .thenCallRealMethod() // 第一次调用执行真实方法
    .thenAnswer(invocation -> {
        // 第二次及以后的调用执行自定义逻辑
        myCustomMethod();
        // 根据send方法的返回类型返回对应值,比如void的话不需要return(或者return null)
        return null;
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:48:25