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的代码层面很规范,也都是一些最佳实践,开发出一个模块 ...
随机推荐
- 使用tensorbaoardx报错——Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
运行代码报错: from tensorboardX import SummaryWriter 报错内容: 发生异常: TypeError Descriptors cannot not be creat ...
- cnetos 9 安装巨坑!!! ssh无法登录
不管任何软件登录 或任何形式的ssh登录 仅开启了密钥的登录 没有账号密码 在安装引导设置root密码时候 下面有个复选框允许root密码ssh登录 勾选即可省略这些步骤 具体步骤: 找到合适的插入位 ...
- Elementui 给输入框加上单位
效果图: 具体代码: <el-input class="el-col-12" v-model="value.projectLevel" :disabled ...
- 关于 MemoryStream 的多次写入,模拟post请求,接收方 .net core web api无法读取到流数据,报 System.IO.IOException: Unexpected end of Stream, the content may have already be en read by another component.
主要是业务不熟害死人.记录一下.真想抽自己几个嘴巴子 先说结论,知道这个结论的下面文字都是废话: 一.new MemoryStream 的时候,如果需要分次写入,只能是像下面这样子 MemoryStr ...
- 2023/11/16 NOIP 模拟赛
T1 基于1的算术 标签 暴力枚举 思路1 赛时想了个假的 DP,只拿了 77 分,,, 小于 \(10^{15}\) 的仅由 \(1\) 组成的数只有 \(15\) 个,直接枚举即可. 想了一个做法 ...
- 宝塔安装onlyoffice
1. 拉取镜像 docker pull onlyoffice/documentserver 2. 构建容器 进入宝塔管理面板->docker->镜像,可以看到镜像已被安装成功 配置容器参数 ...
- XAMPP Windows PHP-CGI 代码执行漏洞(CVE-2024-4577) | Goby漏洞预警
漏洞描述: PHP是一种在服务器端执行的脚本语言,在 PHP 的 8.3.8 版本之前存在命令执行漏洞,由于 Windows 的 "Best-Fit Mapping" 特性,在处理 ...
- Angular Material 18+ 高级教程 – CDK Accessibility の Focus
介绍 CDK Focus 是对原生 DOM focus 的上层封装和扩展. Focus Origin 原生 DOM focus 我们只能知道 element 被 focus 了,但是无法知道它是怎么被 ...
- RxJS 系列 – Join Creation Operators
前言 我们一样从简单和常用的入手. 第一篇介绍了 Creation Operators 上一篇介绍了 Filter Operators 这一篇来到 Join Creation Operators. 参 ...
- CSS – Reset CSS / Base CSS
前言 许多 element tag 都有自带的 style. 比如 h1 默认 font-size 是 2 em anchor 默认颜色是 blue 大部分默认 style 并不会是开发人员期望的效果 ...