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

