新闻详情

新闻详情

首页 / 资讯中心 / 详情

从源码读懂Mockito 5.x架构:mockito-core核心组件与调用链路深度拆解

发布时间:2026/11/5 1:39:24来源:尧图网络
从源码读懂Mockito 5.x架构:mockito-core核心组件与调用链路深度拆解
从源码读懂Mockito 5.x架构mockito-core核心组件与调用链路深度拆解【免费下载链接】mockitoMost popular Mocking framework for unit tests written in Java项目地址: https://gitcode.com/gh_mirrors/mo/mockitoMockito 是 Java 单元测试中最流行的 Mock 框架而mockito-core正是它的灵魂所在。本文带你从源码视角拆解 Mockito 5.x 的架构核心组件有哪些、它们如何分工、一次mock()/when()/verify()调用背后完整走了哪些链路帮助新手快速建立对 Mockito 内部机制的全景认知 一图看懂 mockito-core 的目录架构整个框架的源码位于 mockito-core/src/main/java/org/mockito/可以按职责分成几大块组件包职责代表类org/mockito/对外公开 APIMockito、ArgumentMatchers、Answersinternal/creation/Mock 对象创建字节码生成ByteBuddyMockMaker、MockSettingsImplinternal/handler/拦截并处理每次方法调用MockHandlerImplinternal/stubbing/桩定义stubbing存储与匹配InvocationContainerImplinternal/verification/调用验证verifyVerificationModeFactory、Timesinternal/progress/线程级进行中状态状态机MockingProgressImplinternal/matchers/参数匹配器实现Equals、InstanceOf、Findplugins/插件扩展点MockMaker、AnnotationEngine这个分层非常清晰公开 API 负责易用性internal 包负责核心逻辑plugins 包负责可替换性——Mockito 5.x 的大部分能力都建立在这三者的协作之上。mock() 调用链拆解一个 Mock 是如何诞生的以最常见的Mockito.mock(Service.class)为例调用链路如下入口Mockito.java 的mock()静态方法负责参数校验并把请求委托给内核。内核调度MockitoCore.java 的mock(Class, MockSettings)方法完成三件事用 MockSettingsImpl 把用户设置构造成内部创建配置MockCreationSettings检查DoNotMock注解是否违规调用MockUtil.createMock()真正生成对象。工厂方法MockUtil.java 的createMock()是关键枢纽——它先从插件注册表取出MockMaker创建MockHandler然后把两者交给MockMaker.createMock(settings, handler)。这就是谁创建 Mock、谁拦截调用两条职责线的交汇点。字节码生成默认实现 InlineByteBuddyMockMaker.javaMockito 5.x 默认 inline mock maker基于 ByteBuddy 生成字节码配合 ObjenesisInstantiator 免构造器实例化对象并通过MockMethodAdvice把每个方法调用重定向到 mock 的 handler 上。一句话总结API 层 → 内核调度 → 工厂装配 → MockMaker 生成字节码对象。调用处理核心MockHandlerImpl 的三分支决策Mock 对象每被调用一次都会进入 MockHandlerImpl.java 的handle(Invocation)方法。这里是整个框架最精华的路由器它按优先级做三次判断分支一doReturn/doThrow 风格打桩。若invocationContainer.hasAnswersForStubbing()为真说明用户走的是doReturn(x).when(mock).method()路径此时只记录要打桩哪个方法立即返回 null分支二verify 验证模式。从MockingProgress中取出当前验证模式非空说明处于verify()流程于是构造VerificationDataImpl交给验证器执行断言分支三常规打桩 / 返回值。把本次调用记为潜在打桩目标然后在桩容器里findAnswerFor(invocation)查找匹配答案命中则执行stubbing.answer(invocation)未命中则调用默认 Answer返回 null、0、空集合等让when()链能继续走下去。可以看到打桩、验证、返回值三路流量全部汇聚到这一个 handler这正是 Mockito 拦截一切设计的核心。幕后功臣MockingProgress 状态机MockingProgress 接口实现类 MockingProgressImpl.java管理着当前线程正在进行什么操作的共享状态包括正在进行的打桩reportOngoingStubbing()/pullOngoingStubbing()当前验证模式verificationStarted()/pullVerificationMode()参数匹配器栈ArgumentMatcherStorage——any()、eq()等匹配器先压栈等方法调用真正发生时再由 MatchersBinder 绑定到参数上。它是解释为什么 matcher 不能和普通参数混用为什么打桩要写在when(...)里这类经典问题的关键——答案都藏在状态机的时序约束中 插件体系Mockito 5.x 的扩展骨架plugins/ 目录定义了全套扩展点统一由 Plugins.java 门面类按classpath 约定 默认实现的策略装配MockMakerMock 生成器可在mockito-extensions/org.mockito.plugins.MockMaker文件中声明自定义实现甚至对单个 mock 用withSettings().mockMaker(...)指定AnnotationEngineMock/InjectMocks注解注入引擎InstantiatorProvider2、MemberAccessor、StackTraceCleanerProvider等。这种接口 classpath 文件约定的加载方式让 mockito-subclass、mockito-android 等周边模块无需改动核心代码即可替换实现是 Mockito 模块化拆分mockito-core / mockito-subclass / mockito-inline的根基。关键源码路径速查表想理解什么去看哪里公开 API 全集Mockito.java内核调度逻辑MockitoCore.java调用拦截与路由MockHandlerImpl.java桩存储与匹配InvocationContainerImpl.java验证模式工厂VerificationModeFactory.java时序状态机MockingProgressImpl.java插件加载门面Plugins.java行为验证测试MockitoTest.java写在最后Mockito 5.x 的架构可以浓缩为一句话MockMaker 负责造MockHandler 负责拦InvocationContainer 负责记VerificationMode 负责查而 MockingProgress 是串联四者的共享状态机。理解了这条主链路再去看 deep stubs、static mock、construction mock 等高级特性你会发现它们不过是同一套调用链路在不同入口的复用。建议新手按本文目录 → MockHandlerImpl 源码 → 跑一遍测试的顺序深入用不到一小时就能真正读懂 Mockito 的内部世界 【免费下载链接】mockitoMost popular Mocking framework for unit tests written in Java项目地址: https://gitcode.com/gh_mirrors/mo/mockito创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/4 15:56:54

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/4 22:55:41

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/4 17:01:23

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/4 12:33:12

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/4 1:25:31

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/4 3:51:11

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉