Go mockito 使用说明 (github/mockey)
GitHub - bytedance/mockey: a simple and easy-to-use golang mock library
Go mockito 是什么?
mockey是一个简单易用的golang mock库,可以快速方便的mock函数和变量。目前广泛应用于字节跳动服务的单元测试编写。底层是monkey patch,通过在运行时重写函数指令实现。
- 编译时需要关闭inlining和compilation optimization,否则mock可能失败或者报错。有关详细信息,请参阅以下常见问题解答章节。
- 在实际编写单元测试的过程中,推荐配合Convey库一起使用。
安装
go get github.com/bytedance/mockey@latest
快速指南
import ("fmt""testing". "github.com/bytedance/mockey". "github.com/smartystreets/goconvey/convey"
)func Foo(in string) string {return in
}type A struct{}func (a A) Foo(in string) string { return in }var Bar = 0func TestMockXXX(t *testing.T) {PatchConvey("TestMockXXX", t, func() {Mock(Foo).Return("c").Build() // mock functionMock(A.Foo).Return("c").Build() // mock methodMockValue(&Bar).To(1) // mock variableSo(Foo("a"), ShouldEqual, "c") // assert `Foo` is mockedSo(new(A).Foo("b"), ShouldEqual, "c") // assert `A.Foo` is mockedSo(Bar, ShouldEqual, 1) // assert `Bar` is mocked})// mock is released automatically outside `PatchConvey`fmt.Println(Foo("a")) // afmt.Println(new(A).Foo("b")) // bfmt.Println(Bar) // 0
}
特征
对象 |
分类 |
功能细节 |
函数 |
基础 mock |
普通函数 |
可变参数函数 |
||
普通方法 |
||
可变参数方法 |
||
嵌套结构体方法 |
||
私有类型的导出方法(不同包下) |
||
其他功能 |
mock 后执行原函数 |
|
goroutine 条件过滤 |
||
增量改变 mock 行为 |
||
获取原函数执行次数 |
||
获取 mock 函数执行次数 |
||
变量 |
基础 mock |
普通变量 |
函数变量 |
兼容性
OS Support
- Mac OS(Darwin)
- Linux
- Windows
Arch Support
- AMD64
- ARM64
Version Support
- Go 1.13+
License
Mockey is distributed under the Apache License, version 2.0. The licenses of third party dependencies of Mockey are explained here.
FAQ
如何禁用内联和编译优化?
- Command line:
go test -gcflags="all=-l -N" -v ./...
- Goland:fill
-gcflags="all=-l -N"
in the Run/Debug Configurations > Go tool arguments dialog box
mock后还是进入了原来的函数?
- 尝试使用调试模式。如果能跑通,说明就是问题所在。
- 忘记调用了
Build()
,导致没有实际效果 - 目标函数不完全匹配:
func TestXXX(t *testing.T) {Mock((*A).Foo).Return("c").Build()fmt.Println(A{}.Foo("a")) // enters the original function, because the mock target should be `A.Foo`a := A{}Mock(a.Foo).Return("c").Build()fmt.Println(a.Foo("a")) // enters the original function, because the mock target should be `A.Foo` or extracted from instance `a` using `GetMethod` }
- 目标函数在其他goroutines中执行:
func TestXXX(t *testing.T) {PatchConvey("TestXXX", t, func() {Mock(Foo).Return("c").Build()go Foo("a") // the timing of executing 'foo' is uncertain})// when the main goroutine comes here, the relevant mock has been released by 'PatchConvey'. If 'foo' is executed before this, the mock succeeds, otherwise it failsfmt.Println("over")time.Sleep(time.Second) }
报错“功能太短无法打补丁”?
- 内联或编译优化未禁用:您可以尝试使用调试模式。如果能跑通,说明就是问题所在。请转到常见问题解答的相关部分
- 函数真的太短了:意思是目标函数不到一行,导致编译出来的机器码太短。一般两行以上不会出现这个问题
PatchConvey
Repeat mocking the same function:以最小单位重复mock同一个函数。如果有这样的需求,请获取Mocker
实例并重新mock。- 其他工具mock这个函数:比如monkey或者其他工具mock过这个函数
Go mockito 使用说明 (github/mockey)相关推荐
- mockito 外部接口_【IDEA开发SpringBoot2.0】使用Mockito进行常规接口测试#05
文章目录 前言[^1] 什么是Mockito? 什么是Mock? 为什么要使用Mock? 用PostMan与用Mock有什么区别? 正题 使用Mockito做一个模拟测试 编写代码 开始测试 代码讲解 ...
- 使用强大的 Mockito 测试框架来测试你的代码
这篇教程介绍了如何使用 Mockito 框架来给软件写测试用例 1. 预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试. 如果你不熟悉 JUnit,请查看下面的教程: http: ...
- Mock和Java单元测试中的Mock框架Mockito介绍
什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.程序员通常创造模拟对象(mock object)来测试其他对象 ...
- 使用强大的 Mockito 来测试你的代码
北京 | 高性能计算之GPU CUDA课程11月24-26日3天密集学习 快速带你晋级阅读全文> 作者,曾梓华,稳步前进的机器学习工程师. 原文链接 : Unit tests with Mock ...
- Mock和Mockito简介
本篇对Mock和Mockito做了简单的介绍,并列出了简单的示例. 使用Mockito需要基于JUnit,所以不了解JUnit的同学请先参考一下之前JUnit的文章. 什么是Mock? 在面向对象程序 ...
- Moke和Mockito简介
什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.程序员通常创造模拟对象来测试其他对象的行为,很类似汽车设计者使 ...
- GitHub动漫人脸检测项目lbpcascade animeface
GitHub动漫人脸检测项目lbpcascade animeface GitHub开源项目 动漫人脸检测 环境需求 使用说明 GitHub开源项目 https://github.com/nagadom ...
- 【git】(task4)git提交规范和github说明
学习总结 学习datawhale的git教程.Pull Requests:PR,是github中将修改过的代码分支合并到目标分支的操作.commit是git的最小工作单元,在github的仓库中,PR ...
- mockito 总结
文章目录 1 mock/spy 1.1 mock 1.2 spy 1.3 @Mock/@Spy/@InjectMocks/@Captor/@MockBean/@SpyBean 1.3.1 如何使这些注 ...
最新文章
- 单例模式——Singleton
- Samba+lamp完成指定任务
- 2016-12-31:最后一天:回顾
- 用委托实现窗体间传值
- 海康、大华IPC的rtsp格式
- Linux 启动顺序
- 纳米颗粒C语言数值模拟_J.Hazard. Mater.当“金属纳米酶”邂逅“重金属离子”:机遇与挑战...
- java实验报告的原理_JAVA实验报告
- 【图】Excel快捷键大全+函数公式 职场必备
- windows内网的情况下如何访问外网
- 使用面阵相机进行传送带视频流的拼接
- 《娱乐至死》毁掉我们的,恰恰是我们所热爱的东西!
- Http 同步和异步的区别
- C语言tracert源码,TraceRoute(tracert)源码(基于原始套接字实现)
- Linux 电脑系统基本操作
- 云顶之弈5.26服务器维护,云顶之弈维护到几点 云顶之弈维护公告最新 云顶之弈12月26日几点能上...
- Compose搭档 — Flow、Room
- printk在应用层的设置方式及读取内核打印信息的方法
- 无限速驱动管理工具Driver Genius
- 软件分享:超级兔子2010最新版的九大功能
热门文章
- python基于yolov3实现的手势控制音乐播放器
- 正交多项式曲线拟合(MATLAB代码)
- Java写 soapclient,PHP通过SoapClient调用Java发布的WebService
- 流程图拖拽视觉编程--概述
- java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述.doc...
- 测试加载loding效果的方法
- java利用io流读取文件发生了乱码以及java解析vcf文件
- 科技云报道:实战化时代,安全托管MSS更需“行业专家”
- the thought
- 如何理解有害菌,病原菌,致病菌?