Go-Spring :: Mock v0.0.1 发布,类型安全的 Go 语言 Mocking 库
mock 是一个现代化的、类型安全的 Go 语言 mocking 库,完全支持泛型编程。它提供了简单易用的接口, 可以帮助开发者轻松创建和管理模拟对象,从而提高单元测试的质量和效率。该库旨在解决 Go 语言中传统 mocking 工具存在的类型安全性不足和使用复杂性问题。
主要特性
- 类型安全:利用 Go 1.18+ 的泛型特性,确保编译时的安全性,避免运行时类型错误
- 多种 Mock 模式:
Handle
模式:直接处理函数调用When/Return
模式:基于条件的模拟返回
- 灵活的方法匹配:支持不同数量和类型的参数及返回值(最多支持5个参数和5个返回值)
- 上下文支持:提供与 context 包的集成,方便在分布式系统中进行测试
- 自动重置功能:Manager 提供 Reset 方法,可轻松重置所有模拟器到初始状态
- 详细的错误信息:当没有匹配的 mock 代码或存在多个匹配时,提供清晰的错误提示
安装工具
gsmock 是一个用于生成 Go mock 代码的工具,你可以通过以下方式安装它:
go install github.com/go-spring/mock/gsmock@latest
基本用法
- 定义接口
首先,在你的项目中定义需要 mock 的接口。例如,创建一个名为 service.go 的文件,并添加如下代码:
package main type Service interface { Save(r1, r2, r3, r4, r5, r6 int) }
- 生成 Mock 代码
然后在 service.go 文件中加入 go:generate 指令,即可生成 mock 代码:
//go:generate gsmock
你需要指定一个输出文件名,例如 service_mock.go,否则会输出到控制台上。
//go:generate gsmock -o src_mock.go
你还可以指定哪些接口生成 mock,哪些接口不生成 mock (在接口名前面加!即可)。
//go:generate gsmock -o src_mock.go -i '!RepositoryV2,Repository'
使用示例
以下是一个简单的使用示例:
package mock_test import ( "context" "reflect" "testing" "github.com/go-spring/mock" "github.com/go-spring/mock/internal/assert" ) type Trace struct { TraceId string } type Request struct { Token string } type Response struct { Message string } type Client struct{} var clientType = reflect.TypeFor[Client]() func (c *Client) Get(ctx context.Context, req *Request, trace *Trace) (*Response, error) { if ret, ok := mock.InvokeContext(ctx, clientType, "Get", ctx, req, trace); ok { return mock.Unbox2[*Response, error](ret) } return &Response{Message: "9:xxx"}, nil } // MockGet registers a mock implementation for the Get method. func MockGet(r *mock.Manager) *mock.Mocker32[context.Context, *Request, *Trace, *Response, error] { return mock.NewMocker32[context.Context, *Request, *Trace, *Response, error](r, clientType, "Get") } func TestMockWithContext(t *testing.T) { var c Client // Test case: Unmocked { resp, err := c.Get(t.Context(), &Request{}, &Trace{}) assert.Nil(t, err) assert.Equal(t, resp.Message, "9:xxx") } r := mock.NewManager() ctx := r.BindTo(t.Context()) // Test case: When && Return { r.Reset() MockGet(r). When(func(ctx context.Context, req *Request, trace *Trace) bool { return req.Token == "1:abc" }). Return(func() (resp *Response, err error) { return &Response{Message: "1:abc"}, nil }) resp, err := c.Get(ctx, &Request{Token: "1:abc"}, &Trace{}) assert.Nil(t, err) assert.Equal(t, resp.Message, "1:abc") } // Test case: Handle { r.Reset() MockGet(r). Handle(func(ctx context.Context, req *Request, trace *Trace) (resp *Response, err error) { return &Response{Message: "4:xyz"}, nil }) resp, err := c.Get(ctx, &Request{Token: "4:xyz"}, &Trace{}) assert.Nil(t, err) assert.Equal(t, resp.Message, "4:xyz") } // Test case: Invalid Handle { r.Reset() MockGet(r).Handle(nil) resp, err := c.Get(ctx, &Request{}, &Trace{}) assert.Nil(t, err) assert.Equal(t, resp.Message, "9:xxx") } } type ClientInterface interface { Query(req *Request, trace *Trace) (*Response, error) } // MockClient is a mock implementation of ClientInterface. type MockClient struct { r *mock.Manager } var mockClientType = reflect.TypeFor[MockClient]() // NewMockClient creates a new instance of MockClient. func NewMockClient(r *mock.Manager) *MockClient { return &MockClient{r} } // Query mocks the Query method by invoking a registered mock implementation. func (c *MockClient) Query(req *Request, trace *Trace) (*Response, error) { if ret, ok := mock.Invoke(c.r, mockClientType, "Query", req, trace); ok { return mock.Unbox2[*Response, error](ret) } panic("mock error") } // MockQuery registers a mock implementation for the Query method. func (c *MockClient) MockQuery() *mock.Mocker22[*Request, *Trace, *Response, error] { return mock.NewMocker22[*Request, *Trace, *Response, error](c.r, mockClientType, "Query") } func TestMockNoContext(t *testing.T) { r := mock.NewManager() var c ClientInterface mc := NewMockClient(r) c = mc // Test case: When && Return { r.Reset() mc.MockQuery(). When(func(req *Request, trace *Trace) bool { return req.Token == "1:abc" }). Return(func() (resp *Response, err error) { return &Response{Message: "1:abc"}, nil }) resp, err := c.Query(&Request{Token: "1:abc"}, &Trace{}) assert.Nil(t, err) assert.Equal(t, resp.Message, "1:abc") } // Test case: Handle { r.Reset() mc.MockQuery(). Handle(func(req *Request, trace *Trace) (resp *Response, err error) { return &Response{Message: "4:xyz"}, nil }) resp, err := c.Query(&Request{Token: "4:xyz"}, &Trace{}) assert.Nil(t, err) assert.Equal(t, resp.Message, "4:xyz") } // Test case: Invalid Handle { r.Reset() mc.MockQuery().Handle(nil) assert.Panic(t, func() { _, _ = c.Query(&Request{}, &Trace{}) }, "mock error") } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ONLYOFFICE 桌面编辑器 9.0 版本已发布:更多文件支持、AI 增强、图表查看器等更新
继ONLYOFFICE文档9.0版本重磅发布之后,桌面办公套件也迎来了适用于 Windows、Linux 和 macOS 的新版本。ONLYOFFICE 桌面编辑器 9.0 版本不仅继承了自托管版本主要的新功能和改进,还进行了一些独特的更新。阅读本文,了解详情。 让我们先快速回顾一下新版在线版本的主要功能,这些功能同样适用于 ONLYOFFICE 桌面编辑器 9.0 版本。 文档、表格、幻灯片和 PDF 全新界面 在 9.0 版本中,您可以切换到编辑器新添加的浅色和深色主题,使用全新主题界面。这些新界面中,UI 元素与图标均经过重新设计,界面更加清晰易用,提供现代直观的用户体验。 位置:视图选项卡 -> 界面主题 -> 浅色/深色主题 除了编辑器界面全面升级外,桌面应用的起始窗口也重新进行了设计。简洁的设计让您可以更快找到所需功能,避免被无关内容干扰。 全新图表查看器 9.0 版本引入了ONLYOFFICE图表查看器,使套件功能大幅拓展。您可以在各种平台和设备上打开和查看图表,包括电脑和笔记本。 新增文件格式支持 除了 ONLYOFFICE图表查看器最新版所支持的.vsdx...
- 下一篇
《鸿蒙编程语言白皮书》发布
华为发布了《鸿蒙编程语言白皮书》V1.0 版本。 白皮书核心内容如下: 一、鸿蒙编程语言整体框架 多语言生态:鸿蒙支持 ArkTS、仓颉和 C/C++三种编程语言,它们相互补充,共同支撑鸿蒙应用生态构建。 ArkTS:动态类型编程语言,基于 TypeScript,具有易学易用、生态丰富等特征,适用于高效开发场景。 仓颉:静态类型编程语言,具有高性能、强安全、跨平台等特性,适用于对性能和安全要求较高的场景。 C/C++:适用于高性能计算、硬件加速等特定场景,可通过跨语言互操作封装为 ArkTS 和仓颉扩展模块。 语言互操作:ArkTS 与 C/C++通过 Node-API 实现互操作;仓颉与 C 语言实现函数互相调用及跨语言数据转换;仓颉与 ArkTS 通过互操作库实现数据转换和函数调用。 二、鸿蒙编程语言适用场景 高效开发:ArkTS 兼容 TS 高效语法,提供丰富的基础库和并发能力,支持声明式 UI 开发,可继承 TS/JS 语言生态。 高性能:ArkTS 编译运行时支持混合执行模式,优化模块加载机制,提供高效的并发编程模型;仓颉基于静态类型和静态编译优化技术,具有卓越的性能支持。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Mario游戏-低调大师作品
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,CentOS8安装Elasticsearch6.8.6