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

Java中@Mock与@Spy解析及Mock方法执行逻辑疑问

关于Mockito @Mock对象方法调用的执行逻辑问题

结论先行:不会执行runCode方法的实际逻辑,Mock会直接返回thenReturn()中指定的内容。

Mockito中@Mock的核心工作机制

  • 用@Mock注解创建的对象是一个动态代理生成的假对象,它完全替代了原类的实例,但不会继承原类方法的真实执行逻辑。
  • 当你通过when(service.runCode(Mockito.anyString())).thenReturn("Working")设置存根(Stub)后,后续调用service.runCode(...)时,Mockito的代理会直接拦截这个方法调用,跳过原类中runCode的真实代码,直接返回你预先指定的"Working"。
  • 要是某个方法没设置存根,Mock对象会返回对应类型的默认值:比如字符串返回null、int返回0、布尔值返回false,对象类型返回null。

顺带提下@Spy的区别(你提到了这个注解)

如果是用@Spy创建的对象,默认会执行原类方法的真实逻辑,只有当你用doReturn("Working").when(service).runCode(Mockito.anyString())这种方式主动存根时,才会跳过真实逻辑返回指定值。

针对你的代码补充

注意你的代码里Mock.anyString()应该写成Mockito.anyString()(或者静态导入后写anyString()),不过这不影响核心逻辑:只要是@Mock出来的service,调用runCode就不会走真实方法,直接返回你设置的"Working"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:32:01