mockry提供了使用stretchr/certification/mock包为golang接口轻松生成mock的能力。它删除了使用模拟所需的样板编码。
目录
main
Installation
Github Release
请访问releases页面,为您的平台下载一个pre-built二进制文件。
Docker
使用Docker图像
docker pull vektra/mockery
Homebrew
通过自制安装
brew install vektra/tap/mockery
brew upgrade mockery
go get
或者,您可以使用不推荐的方法:
go get github.com/vektra/mockery/v2/.../
获取软件的开发版本。
Examples
Simplest case
string.go
package test
type Stringer interface {
String() string
}
mockery --name=Stringermocks/Stringer.go
package mocks
import "github.com/stretchr/testify/mock"
type Stringer struct {
mock.Mock
}
func (m *Stringer) String() string {
ret := m.Called()
var r0 string
if rf, ok := ret.Get(0).(func() string); ok {
r0 = rf()
} else {
r0 = ret.Get(0).(string)
}
return r0
}
功能类型案例
send.go
package test
type SendFunc func(data string) (int, error)
mockery --name=SendFuncmocks/SendFunc.go
package mocks
import "github.com/stretchr/testify/mock"
type SendFunc struct {
mock.Mock
}
func (_m *SendFunc) Execute(data string) (int, error) {
ret := _m.Called(data)
var r0 int
if rf, ok := ret.Get(0).(func(string) int); ok {
r0 = rf(data)
} else {
r0 = ret.Get(0).(int)
}
var r1 error
if rf, ok := ret.Get(1).(func(string) error); ok {
r1 = rf(data)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
下一级案件
请参见github.com/jaytaylor/mockery-example,以获得下面大纲的完全可运行版本。
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/jaytaylor/mockery-example/mocks"
"github.com/stretchr/testify/mock"
)
func main() {
mockS3 := &mocks.S3API{}
mockResultFn := func(input *s3.ListObjectsInput) *s3.ListObjectsOutput {
output := &s3.ListObjectsOutput{}
output.SetCommonPrefixes([]*s3.CommonPrefix{
&s3.CommonPrefix{
Prefix: aws.String("2017-01-01"),
},
})
return output
}
// NB: .Return(...) must return the same signature as the method being mocked.
// In this case it's (*s3.ListObjectsOutput, error).
mockS3.On("ListObjects", mock.MatchedBy(func(input *s3.ListObjectsInput) bool {
return input.Delimiter != nil && *input.Delimiter == "/" && input.Prefix == nil
})).Return(mockResultFn, nil)
listingInput := &s3.ListObjectsInput{
Bucket: aws.String("foo"),
Delimiter: aws.String("/"),
}
listingOutput, err := mockS3.ListObjects(listingInput)
if err != nil {
panic(err)
}
for _, x := range listingOutput.CommonPrefixes {
fmt.Printf("common prefix: %+v\n", *x)
}
}
Return Value Provider Functions
如果测试需要访问参数来计算返回值,请将返回值设置为一个函数,该函数将方法的参数作为自己的参数并返回返回值。例如,给定此接口:
package test
type Proxy interface {
passthrough(ctx context.Context, s string) string
}
参数可以作为返回值传递:
import . "github.com/stretchr/testify/mock"
Mock.On("passthrough", mock.AnythingOfType("context.Context"), mock.AnythingOfType("string")).Return(func(ctx context.Context, s string) string {
return s
})
Requirements
Returnpassthrough(string, error)Return
github.com/stretchr/testify/mock.Arguments.Get
panic: assert: arguments: Cannot call Get(0) because there are 0 argument(s). [recovered]ReturnGet(1)Return
Notes
应该明智地使用这种方法,因为返回值通常不应该依赖于模拟中的参数;但是,这种方法对于传递或其他test-only计算之类的情况非常有用。
Extended Flag Descriptions
下面的描述提供了一些常见参数的详细说明。
--name--name--all--all--dir--recursive=true--recursive--recursive--name--all--recursive=true--outputmocks--output./mocks--inpackage--keeptree--inpackage--keeptree--filename--filename--structname--name--case--case underscore--printmockery --print
main
--inpackage
Configuration
mockery在后台使用spf13/viper进行配置解析。它被绑定到三个不同的配置源,按优先级递减的顺序:
- Command line
- Environment variables
- Configuration file
Example
$ export MOCKERY_STRUCTNAME=config_from_env
$ echo $MOCKERY_STRUCTNAME
config_from_env
$ grep structname .mockery.yaml
structname: config_from_file
$ ./mockery showconfig --structname config_from_cli | grep structname
Using config file: /home/ltclipp/git/vektra/mockery/.mockery.yaml
structname: config_from_cli
$ ./mockery showconfig | grep structname
Using config file: /home/ltclipp/git/vektra/mockery/.mockery.yaml
structname: config_from_env
$ unset MOCKERY_STRUCTNAME
$ ./mockery showconfig | grep structname
Using config file: /home/ltclipp/git/vektra/mockery/.mockery.yaml
structname: config_from_file
.mockery.[extension]
Semantic Versioning
此项目中的版本控制仅适用于mockery二进制文件本身的行为。这个项目并没有明确承诺一个稳定的内部API,而是一个稳定的可执行文件。版本控制适用于以下内容:
- CLI arguments.
- Golang代码的解析。Golang语言中的新特性将以backwards-compatible的方式得到支持,除了在主要版本冲突期间。
- 模拟对象的行为。模拟对象可以被认为是公共API的一部分。
- 嘲笑行为给定一组参数。
版本不跟踪的内容:
go get
Development Efforts
v2处于软变更冻结状态,这是由于软件的复杂性以及功能添加通常需要扰乱经过彻底测试但对更改敏感的逻辑。
v1
v1是软件的原始版本,不再受支持。
v2
mockery
v3
v3将包括对整个代码库的ground-up大修,并将彻底改变mockry在内部和外部的工作方式。该项目的亮点是:
mockerypackage.Loadv3