go:极简上手使用 stretchr/testify 进行mock测试

news/2024/10/21 12:16:58

库安装

首先,安装 Mock 类生成工具 Mockery:

go install github.com/vektra/mockery/v2@v2.45.1

实际上,你也可以手动创建 Mock 类。

生成 Mock 类

假设你在 internal/metrics 包下有如下定义的接口:

package metricstype Getter[T any] interface {Get() (T, error)
}

在项目根目录,可以使用以下命令生成 Mock 类:

mockery --name=Getter --dir=internal/metrics

生成的 Mock 类会在 mocks 目录下的 getter.go 文件中。

编写用例

package metricsimport ("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)
}

说明

  1. GetterTestSuite 是测试集的名称,每个method都会作为测试用例调用。TestGetter 函数运行时,会调用 TestGetterInt
  2. TestGetterInt 中引用的 tTestSuite,包含许多有用的断言函数,如 EqualNil 等。
  3. 创建 Mock 实例后,可以使用 On 方法来标记方法对应的返回值。假设 Get 方法可以传递参数,则可以根据不同的参数选择不同的返回值。

Mock 常见用法

假设 mockObj 是 Mock 类的实例:

  1. mockObj.On("GetApiKey", mock.Anything).Return("dummy_api_key")GetApiKey 有一个参数,且无论传什么,都会返回 dummy_api_key
  2. mockObj.On("GetAllClusterInfo").Maybe().Return(GenerateTestClustersInfo()):如果使用 Maybe,则 GetAllClusterInfo 不一定必须被调用;如未使用 Maybe 且函数未被调用,则断言将失败。
  3. mockObj.On("RunCleanup", true, true).Once().Return(nil, nil)RunCleanup 有两个参数,所以需要传递两个 Mock 的值进入。Once 表示这个函数只应该被调用一次。
  4. mockObj.AssertNumberOfCalls(t.T(), "RunCleanup", 4):可以检查方法的调用次数。

通过这些用法,用户可以完全控制 Mock 类的每个方法的行为,并进行一些检查以完善整个测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

如何在C语言中使用外部库

在C语言中使用外部库,首先,你需要找到你需要的库,这可以在网上或者在本地机器上,并获取库的路径。其次,你需要用预处理指令#include <库名.h>将库包含到你的程序中。最后,你需要在链接阶段,用-l库名将库链接到你的程序中。使用外部库可以方便地使用库中预定义的函…

CTF学习( 3):Misc(二维码)

1.见到二维码图片,查看详细信息是否藏有flag(无果),使用QR Research查看二维码中是否藏有隐藏信息 (发现) 2.使用010 editor打开后文本搜索flag,key等关键字无果->发现在文件尾藏了数据(笔记:PNG文件由文件头"89 50 4E 47"和数据块"chuk"组成,50 4B 03 …

modsecurity: 规则的体系一

一,每个事务的生命周期: 如图:每个事务在modsecurity需要经历5个阶段,在每个阶段可能需要解析等操作,然后调用相应阶段的规则进行匹配,对应规则中的phase 阶段一:request headers请求头,这是modsecurity最先接触到的数据, 需要验证请求头相关的规则,并根据请…

SpringBoot 使用WebSocket

WebSocket 是一种网络通信协议,提供了在单个TCP连接上进行全双工通信的能力。这意味着客户端和服务器可以同时发送和接收数据,而不需要等待对方的回应。 Spring Boot 提供了对WebSocket的自动配置和简化的编程模型,使得在Spring Boot应用程序中集成WebSocket变得相对简单。 …

Leetcode 1584. 连接所有点的最小费用

1.题目基本信息 1.1.题目描述 给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [x_i, y_i] 。 连接点 [x_i, y_i] 和点 [x_j, y_j] 的费用为它们之间的 曼哈顿距离 :|x_i – x_j| + |y_i – y_j| ,其中 |val| 表示 val 的绝对值。 请你返回将所有点连接的最小…

Linux系统MySQL安装

Linux系统安装MySQL1.下载安装包 官方网站:https://www.mysql.com/ ,找到下载DOWNLOADS,下载操作系统对应的社区版本。本文使用的数据库版本是5.7.41。在社区版本下载界面可以下载最新和以前的版本。2、安装MySQL 2.1、查看是否已经安装MySQL rpm -qa | grep mysql mysql-li…

宝塔面板如何进行反向代理的配置

反向代理在网络架构中充当重要角色,帮助改善网站性能、安全性并提供额外的配置选项。在宝塔面板中实施反向代理配置,涉及的步骤包括:1. 安装并启动必要的软件;2. 配置代理规则以指向目标服务器;3. 优化性能和安全性设置;4. 对配置进行测试验证。在操作中,我们将详细探讨…