如何使用EasyMock记录被mock方法的所有调用及调用来源?
Mock方法调用记录与来源获取方案
完全可以实现该需求,主流单元测试生态的Mock框架均内置了对应能力,无需自行开发核心逻辑。
通用基础能力说明
所有标准Mock工具默认会记录被Mock方法的调用次数、调用顺序、入参值,仅需调用框架内置的属性或方法即可直接获取。如果需要获取调用来源,可通过框架自带的调用栈捕获能力实现,仅需少量配置即可。
不同语言常用框架实现方式
- Python(unittest.mock / pytest-mock)
- 基础调用记录直接读取
mock_obj.call_args_list属性即可拿到所有历史调用的参数集合,内置的mock_obj.assert_called_once_with(xxx)等断言方法可直接做调用校验。 - 获取调用来源只需给Mock对象设置
side_effect,每次调用时捕获traceback.extract_stack()的返回值即可拿到完整调用链,仅需3行左右附加代码。
- 基础调用记录直接读取
- Java(Mockito)
- 基础调用记录通过
Mockito.mockingDetails(mockObj).getInvocations()即可获取所有调用的元信息,常规校验直接使用Mockito.verify(mockObj).xxxMethod(参数)即可。 - 初始化Mock时添加
withSettings().keepTrackOfInvocations()配置,即可直接从调用元信息中读取调用来源的类、方法、行号,无需额外编码。
- 基础调用记录通过
- 前端(Jest Mock)
- 基础调用记录直接读取
mockFn.mock.calls属性即可拿到所有调用的参数列表,mockFn.mock.instances可获取调用时的上下文指向。 - 临时调试查看调用来源只需在Mock函数实现中加一行
console.trace()即可打印完整调用栈,无需修改测试用例主逻辑。
- 基础调用记录直接读取
如果仅为临时调试定位问题,无需编写持久化的调用存储逻辑,直接在Mock方法处加断点或临时打印调用栈即可,适配存量复杂代码的成本极低。
内容的提问来源于stack exchange,提问作者AppleMoose
相关产品推荐
相关产品推荐

