Mockito MockedStatic疑问:未使用实例为何必须调用mockStatic()
先给结论:你看到的「没用到实例」只是表面现象,这个mockedStaticRepo引用的核心作用是维持Mockito静态模拟上下文的生命周期,没有它,你的静态方法存根会直接失效。
具体原理拆解:
MockStatic的本质
当你调用mockStatic(Repository.class)时,Mockito会创建一个静态模拟上下文,这个上下文会接管Repository类所有静态方法的调用逻辑。只要这个上下文存在,Mockito就能拦截该类的静态方法调用,允许你存根或者验证行为。为什么必须保留引用?
MockedStatic是一个需要手动管理生命周期的资源:它会在被垃圾回收时自动关闭静态模拟上下文。如果不在beforeAll里把它赋值给静态变量mockedStaticRepo,这个实例会在beforeAll方法执行完后就被GC回收,静态模拟上下文直接消失。这时候你在
beforeEach里写的when(Repository.getInstance(this.application)).thenReturn(repository)会直接失效——要么抛出「无法存根静态方法,因为没有激活的静态模拟上下文」的异常,要么测试运行时Repository.getInstance会调用真实实现,导致ViewModel拿到的不是你Mock的repository,最终verify(listener)失败。为什么不用
mockedStaticRepo.when(...)语法?
Mockito 3.x+版本支持两种静态方法存根方式:- 传统的
when(静态方法调用).thenReturn(...)(前提是静态模拟上下文已激活) mockedStaticRepo.when(Repository::getInstance).thenReturn(...)
你用的第一种语法是合法的,但它依然依赖mockStatic创建的上下文——而这个上下文的存活全靠mockedStaticRepo的引用撑着。
- 传统的
总结
你代码里的mockedStaticRepo看似没被直接使用,但它是静态模拟上下文的「锚点」:只要这个引用存在,Mockito就不会回收静态模拟上下文,你的静态方法存根才能生效,测试才能正常运行。
内容的提问来源于stack exchange,提问作者automaton

