go:极简上手使用 stretchr/testify 进行mock测试
库安装
首先,安装 Mock 类生成工具 Mockery:
go install github.com/vektra/mockery/v2@v2.45.1
实际上,你也可以手动创建 Mock 类。
生成 Mock 类
假设你在 internal/metrics
包下有如下定义的接口:
package metrics
type Getter[T any] interface {
Get() (T, error)
}
在项目根目录,可以使用以下命令生成 Mock 类:
mockery --name=Getter --dir=internal/metrics
生成的 Mock 类会在 mocks
目录下的 getter.go
文件中。
编写用例
package metrics
import (
"testing"
mocks "xxx/mock/internal_/metrics"
"github.com/stretchr/testify/suite"
)
type GetterTestSuite struct {
suite.Suite
}
func TestGetter(t *testing.T) {
suite.Run(t, new(GetterTestSuite))
}
func (t *GetterTestSuite) TestGetterInt() {
t.T().Logf("TestGetterInt run")
getter := new(mocks.Getter[int])
getter.On("Get").Return(1, nil)
val, err := getter.Get()
t.Nil(err)
t.Equal(1, val)
}
说明:
- GetterTestSuite 是测试集的名称,每个method都会作为测试用例调用。TestGetter 函数运行时,会调用 TestGetterInt。
- TestGetterInt 中引用的
t
是TestSuite
,包含许多有用的断言函数,如Equal
和Nil
等。 - 创建 Mock 实例后,可以使用
On
方法来标记方法对应的返回值。假设Get
方法可以传递参数,则可以根据不同的参数选择不同的返回值。
Mock 常见用法:
假设 mockObj
是 Mock 类的实例:
mockObj.On("GetApiKey", mock.Anything).Return("dummy_api_key")
:GetApiKey
有一个参数,且无论传什么,都会返回dummy_api_key
。mockObj.On("GetAllClusterInfo").Maybe().Return(GenerateTestClustersInfo())
:如果使用Maybe
,则GetAllClusterInfo
不一定必须被调用;如未使用Maybe
且函数未被调用,则断言将失败。mockObj.On("RunCleanup", true, true).Once().Return(nil, nil)
:RunCleanup
有两个参数,所以需要传递两个 Mock 的值进入。Once
表示这个函数只应该被调用一次。mockObj.AssertNumberOfCalls(t.T(), "RunCleanup", 4)
:可以检查方法的调用次数。
通过这些用法,用户可以完全控制 Mock 类的每个方法的行为,并进行一些检查以完善整个测试。
go:极简上手使用 stretchr/testify 进行mock测试的更多相关文章
- WebFetch 是无依赖极简网页爬取组件
WebFetch 是无依赖极简网页爬取组件,能在移动设备上运行的微型爬虫. WebFetch 要达到的目标: 没有第三方依赖jar包 减少内存使用 提高CPU利用率 加快网络爬取速度 简洁明了的api ...
- Mongodb极简实践
MongoDB 极简实践入门 1. 为什么用MongoDB? 传统的计算机应用大多使用关系型数据库来存储数据,比如大家可能熟悉的MySql, Sqlite等等,它的特点是数据以表格(table)的形式 ...
- Asky极简教程:零基础1小时学编程,已更新前8节
Asky极简架构 开源Asky极简架构.超轻量级.高并发.水平扩展.微服务架构 <Asky极简教程:零基础1小时学编程>开源教程 零基础入门,从零开始全程演示,如何开发一个大型互联网系统, ...
- MongoDB 极简实践入门
原作者StevenSLXie; 原链接(https://github.com/StevenSLXie/Tutorials-for-Web-Developers/blob/master/MongoDB% ...
- Spring Boot (七): Mybatis极简配置
Spring Boot (七): Mybatis极简配置 1. 前言 ORM 框架的目的是简化编程中的数据库操作,经过这么多年的发展,基本上活到现在的就剩下两家了,一个是宣称可以不用写 SQL 的 H ...
- itest(爱测试) 开源一站式敏捷测试管理平台&极简项目管理,重大升级(接口测试)6.0.0 发布
itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...
- 纯粹极简的react状态管理组件unstated
简介 unstated是一个极简的状态管理组件 看它的简介:State so simple, it goes without saying 对比 对比redux: 更加灵活(相对的缺点是缺少规则,需要 ...
- 极简python教程02:基础变量,删繁就简
python极简教程已经开赛,如果错过说明可以回翻: 极简python教程:赛前说明 借这个机会,我再讲讲我的教程和其他网上的教程的区别: 1 我分享的内容,是我在工作中会高频使用的语法,是精华内容 ...
- 极简python教程:快速入门好方法
大家好,我是测试奇谭的作者风风. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的快速教程,他们的痛点同大多数自学编程语言的人一样,遇到了这些问题: 网络上的信息太多,良莠不 ...
- 极简实用的Asp.NetCore模块化框架决定免费开源了
背景 在开发这个框架之前,前前后后看过好几款模块化的框架,最后在一段时间内对ABP VNext痛下狠心,研究一段时间后,不得不说 ABP VNext的代码层面很规范,也都是一些最佳实践,开发出一个模块 ...
随机推荐
- 如何将python的pip源设置为阿里云
为python的pip源设置为阿里云,pip源的设置操作: pip config set global.index-url https://mirrors.cloud.aliyuncs.com/pyp ...
- 强化学习:AC算法中为什么不使用Q函数来表示优势函数
强化学习中的策略梯度法(PG)不直接使用Q函数作为值函数来进行计算已经在Sutton的PG公式证明中提出,主要作用就是减少方差,因此使用优势函数进行计算.作为PG算法类中最常见的AC类算法有着较多的使 ...
- csv或excel文件通过plsql导入到oracle数据库中
1.背景 实际开发中经常遇到将数据直接导入到数据库中,操作如下 2.操作 第一步: 第二步:选择要导入的csv文件 第三步:选择数据库表字段与csv的列对应,然后点击导入,完成 完美!
- 【CDQ分治】三元环
三元环 HDU - 7439 思路 考虑 \(3\) 个点的有向图,要么成环,要么有一个点入度为 \(2\) ,假设第 个点的入度为 \(d_i\),答案为 \(C_n^3-\sum\limits_{ ...
- games101 作业4及作业5 详解光线追踪框架
games101 作业4及作业5 详解光线追踪框架 作业4 代码分析 作业四的代码整体比较简单 主要流程就是 通过鼠标事件 获取四个控制点的坐标 然后绘制贝塞尔曲线的内容就由我们来完成 理论分析 贝塞 ...
- USACO 2023DEC Bronze
http://www.usaco.org/index.php?page=dec23results 摆了一晚上,十点多才开,以为都是 sb 题,结果我是 sb T1 交了个暴力过了才意识到复杂度是对的 ...
- C语言基础- Hello World
第一个C语言程序 Hello World # include <stdio.h> //#关键标识符,表示用用头文件:include:引入都文件关键字 // stdio.h:系统标准输入.输 ...
- react + vite
Vite 和 Yarn都比较新的技术 Ref: https://www.digitalocean.com/community/tutorials/how-to-set-up-a-react-proje ...
- OIDC – 关于 SAML 和 ADFS
前言 最近听朋友说, 正在使用 ADFS 做 SSO, 哎哟. 我都是用 OIDC 做的, 这个 ADFS 是啥? 没听过. 于是搜索了一下, 这里先做一个小记入. ADFS 介绍 参考: stack ...
- Facebook – Facebook Page Embed
前言 在网站嵌套 Facebook 专页是很好的推广方式哦. 虽然网站还是需要做 Blog, 但是通常被订阅的都是 Facebook 专页而不是网站 Blog. 开通账号 它的 setup 很简单, ...