GitHub - bytedance/mockey: a simple and easy-to-use golang mock library

Go mockito 是什么?

mockey是一个简单易用的golang mock库,可以快速方便的mock函数和变量。目前广泛应用于字节跳动服务的单元测试编写。底层是monkey patch,通过在运行时重写函数指令实现。

  1. 编译时需要关闭inlining和compilation optimization,否则mock可能失败或者报错。有关详细信息,请参阅以下常见问题解答章节。
  2. 在实际编写单元测试的过程中,推荐配合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

如何禁用内联和编译优化?

  1. Command line:go test -gcflags="all=-l -N" -v ./...
  2. Goland:fill -gcflags="all=-l -N" in the Run/Debug Configurations > Go tool arguments dialog box

mock后还是进入了原来的函数?

  1. 尝试使用调试模式。如果能跑通,说明就是问题所在。
  2. 忘记调用了Build(),导致没有实际效果
  3. 目标函数不完全匹配:
    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`
    }
  4. 目标函数在其他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)
    }

报错“功能太短无法打补丁”?

  1. 内联或编译优化未禁用:您可以尝试使用调试模式。如果能跑通,说明就是问题所在。请转到常见问题解答的相关部分
  2. 函数真的太短了:意思是目标函数不到一行,导致编译出来的机器码太短。一般两行以上不会出现这个问题
  3. PatchConveyRepeat mocking the same function:以最小单位重复mock同一个函数。如果有这样的需求,请获取Mocker实例并重新mock。
  4. 其他工具mock这个函数:比如monkey或者其他工具mock过这个函数

Go mockito 使用说明 (github/mockey)相关推荐

  1. mockito 外部接口_【IDEA开发SpringBoot2.0】使用Mockito进行常规接口测试#05

    文章目录 前言[^1] 什么是Mockito? 什么是Mock? 为什么要使用Mock? 用PostMan与用Mock有什么区别? 正题 使用Mockito做一个模拟测试 编写代码 开始测试 代码讲解 ...

  2. 使用强大的 Mockito 测试框架来测试你的代码

    这篇教程介绍了如何使用 Mockito 框架来给软件写测试用例 1. 预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试. 如果你不熟悉 JUnit,请查看下面的教程: http: ...

  3. Mock和Java单元测试中的Mock框架Mockito介绍

    什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.程序员通常创造模拟对象(mock object)来测试其他对象 ...

  4. 使用强大的 Mockito 来测试你的代码

    北京 | 高性能计算之GPU CUDA课程11月24-26日3天密集学习 快速带你晋级阅读全文> 作者,曾梓华,稳步前进的机器学习工程师. 原文链接 : Unit tests with Mock ...

  5. Mock和Mockito简介

    本篇对Mock和Mockito做了简单的介绍,并列出了简单的示例. 使用Mockito需要基于JUnit,所以不了解JUnit的同学请先参考一下之前JUnit的文章. 什么是Mock? 在面向对象程序 ...

  6. Moke和Mockito简介

    什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.程序员通常创造模拟对象来测试其他对象的行为,很类似汽车设计者使 ...

  7. GitHub动漫人脸检测项目lbpcascade animeface

    GitHub动漫人脸检测项目lbpcascade animeface GitHub开源项目 动漫人脸检测 环境需求 使用说明 GitHub开源项目 https://github.com/nagadom ...

  8. 【git】(task4)git提交规范和github说明

    学习总结 学习datawhale的git教程.Pull Requests:PR,是github中将修改过的代码分支合并到目标分支的操作.commit是git的最小工作单元,在github的仓库中,PR ...

  9. mockito 总结

    文章目录 1 mock/spy 1.1 mock 1.2 spy 1.3 @Mock/@Spy/@InjectMocks/@Captor/@MockBean/@SpyBean 1.3.1 如何使这些注 ...

最新文章

  1. 单例模式——Singleton
  2. Samba+lamp完成指定任务
  3. 2016-12-31:最后一天:回顾
  4. 用委托实现窗体间传值
  5. 海康、大华IPC的rtsp格式
  6. Linux 启动顺序
  7. 纳米颗粒C语言数值模拟_J.Hazard. Mater.当“金属纳米酶”邂逅“重金属离子”:机遇与挑战...
  8. java实验报告的原理_JAVA实验报告
  9. 【图】Excel快捷键大全+函数公式 职场必备
  10. windows内网的情况下如何访问外网
  11. 使用面阵相机进行传送带视频流的拼接
  12. 《娱乐至死》毁掉我们的,恰恰是我们所热爱的东西!
  13. Http 同步和异步的区别
  14. C语言tracert源码,TraceRoute(tracert)源码(基于原始套接字实现)
  15. Linux 电脑系统基本操作
  16. 云顶之弈5.26服务器维护,云顶之弈维护到几点 云顶之弈维护公告最新 云顶之弈12月26日几点能上...
  17. Compose搭档 — Flow、Room
  18. printk在应用层的设置方式及读取内核打印信息的方法
  19. 无限速驱动管理工具Driver Genius
  20. 软件分享:超级兔子2010最新版的九大功能

热门文章

  1. python基于yolov3实现的手势控制音乐播放器
  2. 正交多项式曲线拟合(MATLAB代码)
  3. Java写 soapclient,PHP通过SoapClient调用Java发布的WebService
  4. 流程图拖拽视觉编程--概述
  5. java web聊天室论文_基于Java网页版聊天室的设计与实现毕业论文含开报告及文献综述.doc...
  6. 测试加载loding效果的方法
  7. java利用io流读取文件发生了乱码以及java解析vcf文件
  8. 科技云报道:实战化时代,安全托管MSS更需“行业专家”
  9. the thought
  10. 如何理解有害菌,病原菌,致病菌?