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的代码层面很规范,也都是一些最佳实践,开发出一个模块 ...
随机推荐
- 如何拉取指定CPU架构的并且指定ubuntu版本的docker镜像
拉取不同CPU架构下ubuntu22.04镜像: aarch64 (arm v8) CPU架构: docker pull --platform=linux/aarch64 ubuntu:22.04 x ...
- Vector源码解读
1.背景 阅读源码是提高编程技能的有效方式... 面试中也经常问到源码相关的问题..... 2.源码解读 在解读Vector时大家可以先解读ArrayList,因为这个两个的逻辑几乎是一样的.... ...
- WhaleStudio 2.6正式发布,WhaleTunnel同步性能与连接器数量再创新高!
在这个数据驱动的大模型时代,数据集成的作用和意义愈发重要.数据不仅仅是信息的载体,更是推动企业决策和创新的关键因素.作为全球最流行的批流一体数据集成工具,WhaleTunnel随着WhaleStudi ...
- 手把手教你掌握SeaTunnel k8s运行Zeta引擎本地模式的技巧
转载自小虾米0.0 导读:随着Kubernetes的普及和发展,越来越多的企业和团队开始使用Kubernetes来管理和部署应用程序.然而,Kubernetes的默认工作方式可能不是最佳的选择,尤其是 ...
- 微服务全链路跟踪:jaeger增加tag参数
微服务全链路跟踪:grpc集成zipkin 微服务全链路跟踪:grpc集成jaeger 微服务全链路跟踪:springcloud集成jaeger 微服务全链路跟踪:jaeger集成istio,并兼容u ...
- flink + iceberg 快速搭建指南
flink + iceberg 快速搭建 the environment includes: minio iceberg flink Centos 更换 tencent 的yum源 备份系统旧配置文件 ...
- PCSR:已开源,三星提出像素级路由的超分辨率方法 | ECCV 2024
基于像素级分类器的单图像超分辨率方法(PCSR)是一种针对大图像高效超分辨率的新方法,在像素级别分配计算资源,处理不同的恢复难度,并通过更精细的粒度减少冗余计算.它还在推断过程中提供可调节性,平衡性能 ...
- 使用 Dependify 工具探索 .NET 应用程序依赖项
在大型项目中,由于各种组件的复杂性和互连性,管理依赖项可能变得具有挑战性.如果没有适当的工具或文档,可能很难浏览项目并对依赖项做出假设.以下是在大型项目中难以导航项目依赖项的几个原因: 复杂性:大型项 ...
- 测距技术 超声波、毫米波、激光雷达LIDAR
超声波 技术成熟,成本之选 声波传输慢,高速时误差大 超声波雷达有40kHz.48kHz和58kHz三种,频率越高,灵敏度越高,探测角度越小.在工作状态,通过收发超声波,超声波雷达能以1-3cm精度测 ...
- kuboard部署在k8s集群中
kuboard部署在k8s集群中,yaml配置文件 #cat kuboard.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: a ...