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

