mock
你的server需要的依赖,在声明server就得注入进去,而且该依赖必须得用interface的方式声明
面向接口编程能够不断解耦,同时也能缩小测试范围,编写测试用例
你需要下载2个工具包
go get github.com/golang/mock/mockgen
//mockgen负责生成我们定义的interface的mock文件
go get github.com/golang/mock/gomock
//使用mockgen生成的文件的时候需要用到的胶水包
go get github.com/bmizerany/assert
//断言,方面我们定制自己期望的结果
![](https://img.haomeiwen.com/i5746597/4cf77fa44a9c9d8c.png)
执行命令
mockgen.exe -source=source.go -destination=db_mock.go -package=source
source.go 你interface生成的路径位置,db_mock.go生成的mock文件的位置(注意文件夹提前生成好),source生成的包名
demo
import (
"context"
"fmt"
"github.com/bmizerany/assert"
"github.com/golang/mock/gomock"
"sync"
"testing"
"time"
)
func Test_coreImpl_CreateConsumer(t *testing.T) {
mockCtl := gomock.NewController(t)
//review 指的就是你上一步生成的mock文件的包名了,mock工具生成的文件,都提供NewMockXxx的方法,方便我们获取mock对象
mockReview := review.NewMockReview(mockCtl)
mockSource := source.NewMockSource(mockCtl)
mockRepository := store.NewMockRepository(mockCtl)
//我们能通过这里的EXPECT 去定义我们mock的方法传参数类型,以及返回值
//gomock.Any() 参数可以是任何类型
// .AnyTimes() 方法可以被调用多少次,无数次
//Return(a, nil) 返回值
mockRepository.EXPECT().GetPermanent().Return([]db.ContentReviewPermanent{
db.ContentReviewPermanent{Id: 1, TextId: 0, ImageId: 2, SourceTableName: (&db.ContentReviewBbsCnhubeiUser{}).TableName()},
db.ContentReviewPermanent{Id: 2, TextId: 2, ImageId: 1, SourceTableName: (&db.ContentReviewBbsCnhubeiArticle{}).TableName()},
}, nil).AnyTimes()
mockReview.EXPECT().SensitiveWords(gomock.Any()).Return(false, nil).AnyTimes()
mockRepository.EXPECT().CreateAuditV2(gomock.Any()).Return(nil).AnyTimes()
t.Run("CreateConsumer", func(t *testing.T) {
c := NewCoreImpl(mockReview, mockSource, mockRepository)
c.imageWorkNum = 3
c.textWorkNum = 30
c.updPermanentData()
assert.Equal(t, len(c.permanentData), 2)
assert.Equal(t, c.permanentData[0].imageId, int32(2))
assert.Equal(t, c.permanentData[1].textId, int32(2))
t.Log(t, "consumer success")
})
}
网友评论