mockit

package module
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 17, 2021 License: MIT Imports: 12 Imported by: 0

README

Mockit

Go Report Card Go

目标:将mock变得简单,让代码维护变得容易

分支介绍

  • main 主分支,覆盖了单元测试
  • light 轻分支,去除了单元测试,简化了依赖项,方便其他团队使用

常见Mock难点

  • 不同中间件,mock库设计模式不一致,学习代价高,差异化明显
  • mock方案强依赖服务端,无法灵活解耦
  • 单元测试适配各种中间件的方案后,依赖管理杂乱
  • 综上所述不想写mock,也没有良好的可执行方案,放弃单测

mockit做到了什么

  • 统一简化语法
  • 无需服务端
  • 解耦依赖项
  • testMain统一管理

mockit 使用

目前支持
  • Redis,MySQL,Interface,HTTP
  • GRPC 可以使用proto生成interface使用Interface模拟
  • ElasticSearch
    • 使用HTTP方式代理client,不过es的返回值比较复杂,请求路径没有普通HTTP直观
    • 使用Interface方式,将dao层抽象成接口方式,这种方式下,接口返回值模拟相对方便直观

理论上业务抽象使用Interface方式都可达成

准备 (具体参照kit_test.go)
  1. interface生成 https://github.com/golang/mock
// interface生成方式
$ mockgen -source ./iface/interface.go -package mockimpl -destination ./mockimpl/interface.go
// 而后将以下new方法的返回值改成interface{}
before: func NewMockDemoInterface(ctrl *gomock.Controller) *MockDemoInterface {
after: func NewMockDemoInterface(ctrl *gomock.Controller) interface{}} {
    mock := &MockDemoInterface{ctrl: ctrl}
    mock.recorder = &MockDemoInterfaceMockRecorder{mock}
    return mock
}
  1. sqlmock依赖replace

目前需要替换下sqlmock库,目前pr还在合并中,预计最近2周就能OK

replace github.com/DATA-DOG/go-sqlmock v1.5.0 => github.com/Rennbon/go-sqlmock v1.5.1-0.20211212104631-9c4a20760689
mockit自身单测
  • 当前目录下 iface 中有4个方法, mockimpl中分别为各个mock实例的实现
  • kit_test.go中mockSrv引用了这些mockimpl实例,在testMain中列举了mock的启动方式,并且在之后所有的Test中介绍了如何使用

引用传送

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type ExpectKey

type ExpectKey = string

ExpectKey custom key In the case of mysql: `json` `string` `func` choose excepted response

const (
	// for http response encode
	HttpResponseFunc   ExpectKey = "func"   // first
	HttpResponseString ExpectKey = "string" // second
	HttpResponseJson   ExpectKey = "json"   // third

)

type ExpectParam

type ExpectParam interface {
	// WithPath 路径类
	// interface : mock client name
	// http:  url "http://mock.com/get"
	WithPath(path string) ExpectParam
	// WithMethod 动作/方法类
	// http :  POST GET DELETE等
	// mysql: "SELECT (.+) FROM DEMO"  "INSERT INTO$"等
	WithMethod(method string) ExpectParam
	// WithArgs 入参
	WithArgs(args ...interface{}) ExpectParam
	// WithArgsByIndex 下标入参
	// NOTE: 目前针对interface封装,不覆盖的会走Any(忽略匹配)逻辑
	WithArgsByIndex(index int, value interface{}) ExpectParam
	// WithHttpResponseFunc 设置Http response
	// http 设置可变response用
	WithHttpResponseFunc(f func(req *http.Request) (*http.Response, error)) ExpectParam
	// WithReturns 设置预期返回值
	// http: 限制1个,默认匹配interface类型,匹配string时,response 返回为string,其他情况response使用json
	// mysql: 支持 struct/slice/array 默认使用json tag,如果mockit设置tag为其他,如"mock",可参见单元测试
	// 其他: 全量
	WithReturns(m ...interface{}) ExpectParam
	// WithKeyValReturn 设置单个预期返回值
	// mysql:如查询计数时,可使用 "COUNT", 20   => 代表返回20,注意这个`COUNT`必须和查询语句的大小写相同
	// http: 支持 string json 2种key,区分response返回的类型
	WithKeyValReturn(key ExpectKey, val interface{}) ExpectParam
}

ExpectParam mockit ioc/控制反转 参数

func NewExpectParam

func NewExpectParam() ExpectParam

type MockClientInitFunc

type MockClientInitFunc func(ctrl *gomock.Controller) interface{}

type Mockit

type Mockit interface {
	// GetInterfaceClient 获取interface的mockClient,获取后 m.(*MockXX)获得实例
	GetInterfaceClient(name string) interface{}
	// MysqlExecExpect mysql 增删改使用
	MysqlExecExpect(ep ExpectParam, tb testing.TB)
	// MysqlQueryExpect mysql 查询使用
	MysqlQueryExpect(ep ExpectParam, tb testing.TB)
	// InterfaceExpect interface mockgen 生成使用
	// NOTE: grpc 推荐mockgen生成后使用此方案作为mock代理
	InterfaceExpect(ep ExpectParam, tb testing.TB)
	// HttpExpect http client 拦截使用
	// NOTE: ES也是此方案
	HttpExpect(ep ExpectParam, tb testing.TB, httpStatus ...int)
	// BeforeTest NOTE:清洁单元测试环境
	BeforeTest()
	// AfterTest NOTE:配合BeforeTest
	AfterTest()
	// SqlDB 获取sql conn
	SqlDB() *sql.DB
	// InterceptHttpClient 拦截http client
	InterceptHttpClient(client *http.Client)

	// RedisAddr 获取伪redis server addr
	RedisAddr() string
}

Mockit mock工具集,集成如下

  1. http (elasticSearch)
  2. MYSQL (支持多类sql,目前支持了mysql,如需添加请联系)
  3. Redis
  4. interface (GRPC) NOTE: 需结合https://github.com/golang/mock使用,生成后需要将实例化返回值改为interface{},如: NewMockXXX(ctrl *gomock.Controller) interface{}

func New

func New(fs ...MockClientInitFunc) (Mockit, error)

New 创建mock工具包 @fs: 使用mockgen生成的interface mock client NOTE: 一般默认生成的是 NewMockDemoInterface(ctrl *gomock.Controller) *MockDemoInterface TODO: 需要修改成 NewMockDemoInterface(ctrl *gomock.Controller) interface{}后传入,方可拦截代理

func NewWithMockTag

func NewWithMockTag(tag string, fs ...MockClientInitFunc) (Mockit, error)

NewWithMockTag 创建mock工具包 @ormTag: mysql 映射的实体tag,如下可使用"mock"作为tag数据库映射, NOTE: gorm中可以带primary key;varchar等,请自定义tag使用

type Kit struct {
  Name string "mock:"name"
}

@fs: 使用mockgen生成的interface mock client NOTE: 一般默认生成的是 NewMockDemoInterface(ctrl *gomock.Controller) *MockDemoInterface TODO: 需要修改成 NewMockDemoInterface(ctrl *gomock.Controller) interface{}后传入,方可拦截代理

Directories

Path Synopsis
Package mockimpl is a generated GoMock package.
Package mockimpl is a generated GoMock package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL