Mockito 3.x 中如何禁止对指定类进行Mock?
Mockito 3.x 禁止指定类被Mock的实现方法
Mockito 3.x 原生支持针对指定类的Mock拦截禁止,不需要额外做侵入式的类结构设计,具体实现路径按版本分支分为两类:
3.5.0及以上3.x分支的原生实现
- 框架从3.5.0版本开始内置了Mock排除校验能力,不需要引入额外自定义组件
- 全测试全局配置可以通过实现
org.mockito.configuration.MockitoConfiguration接口,重写excludeClassesFromMocking()方法,将需要禁止被Mock的类列表返回给框架,全局生效 - 单个测试类的临时隔离场景,可以通过
MockitoFramework实例调用addMockedTypeExclusion()、addStaticExclusion()方法,为当前测试上下文单独配置禁止Mock的类型 - 校验逻辑是在Mockito生成代理对象的前置链路执行的,只要被列入排除列表,不管是创建常规类Mock、还是拦截静态方法Mock,只要尝试生成对应Mock实例,就会直接抛出明确的框架校验异常,阻断违规Mock的生成
3.5.0之前3.x分支的兜底实现
如果使用的是3.5.0之前的3.x版本,没有内置的排除API,可以通过自定义MockMaker实现类做前置拦截:
- 重写
createMock方法的入口逻辑,先做类型校验,匹配到禁止Mock的类直接抛出明确的自定义异常,阻断后续的代理生成流程 - 可以将禁止Mock的类集合和团队开发规范绑定,比如核心工具类、全局配置类、单例枚举类这类明确不允许替代真实依赖的类型,统一维护到校验集合中
这类基于Mock生成链路的校验规则,和类本身是否是final、是否包含静态方法无关,不会被mockito-inline的代理增强能力绕过,可靠性远高于传统的“将类设计为带静态方法的final类”的防mock方式。
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

