Go

mockery介绍及使用

Posted by TopJohn on 2019-10-12
本文总阅读量

介绍

mockery,Golang的一种用于模拟实例的自动生成工具。

mockery为golang提供了自动生成接口实例的能力。它删除了用于模拟的样板代码。

安装

执行go get github.com/vektra/mockery/.../,安装到$GOPATH/bin/mockery

例子

最简单的例子

例如在string.go

1
2
3
4
5
package test

type Stringer interface {
String() string
}

运行:mockery -name=Stringer,然后将会生成下列内容mocks/Stringer.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
}

接下来的例子

参见<github.com/jaytaylor/mockery-example>获取完整的运行例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)
}
}

导入

mockery将接口用到的包自动导入以此保证类型正确。然后,它将通过imports 包运行输出以删除所有不必要的导入(因为它们会导致编译错误)。

类型

mockery应该能够处理所有类型。如果不能的话,你可以反馈。

返回值提供功能

如果您的测试需要访问参数以计算返回值,则将返回值设置为一个将方法的参数作为自己的参数并返回返回值的函数。例如,给定此接口:

1
2
3
4
5
package test

type Proxy interface {
passthrough(s string) string
}

该参数可以作为返回值传递:

1
2
3
4
5
import . "github.com/stretchr/testify/mock"

Mock.On("passthrough", AnythingOfType("string")).Return(func(s string) string {
return s
})