mockery

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进行配置解析。它被绑定到三个不同的配置源,按优先级递减的顺序:

  1. Command line
  2. Environment variables
  3. 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,而是一个稳定的可执行文件。版本控制适用于以下内容:

  1. CLI arguments.
  2. Golang代码的解析。Golang语言中的新特性将以backwards-compatible的方式得到支持,除了在主要版本冲突期间。
  3. 模拟对象的行为。模拟对象可以被认为是公共API的一部分。
  4. 嘲笑行为给定一组参数。

版本不跟踪的内容:

go get

Development Efforts

v2处于软变更冻结状态,这是由于软件的复杂性以及功能添加通常需要扰乱经过彻底测试但对更改敏感的逻辑。

v1

v1是软件的原始版本,不再受支持。

v2

mockery

v3

v3将包括对整个代码库的ground-up大修,并将彻底改变mockry在内部和外部的工作方式。该项目的亮点是:

mockerypackage.Loadv3

Stargazers

Stargazers over time