
go mock 是一个模拟框架,允许开发人员为我们的接口创建模拟结构并定义其行为。
例如,它可以帮助我们生成 reponsitory 的模拟实现,并根据某些输入定义预期输出。
原始仓库:https://github.com/golang/mock
现在不再维护了,所以我们应该使用 https://github.com/uber-go/mock 来代替。
go install go.uber.org/mock/mockgen@latest
按照此文档了解如何使用mockgen cli:
https://github.com/uber-go/mock?tab=readme-ov-file#running-mockgen
假设你有一个 iuserrepo 接口,其中包含一些方法:
ports.go
package user
type iuserrepo interface {
getuserbyid(id int) (*user, error)
insert(user user) error
update(id int, user user) error
}
domain.go
package user
type user struct {
id int
name string
}
服务.go
package user
import "fmt"
type userservice struct {
repo iuserrepo
}
var invaliduseriderror = fmt.errorf("invalid user id")
func (u *userservice) upsert(user user) error {
if user.id <= 0 {
return invaliduseriderror
}
existinguser, err := u.repo.getuserbyid(user.id)
if err != nil {
return err
}
if existinguser == nil {
return u.repo.insert(user)
}
return u.repo.update(user.id, user)
}
1.运行mockgen来生成mock实例
go run go.uber.org/mock/mockgen@latest -source=interface.go -destination=mock.go -package=user
2.指定期望
service_test.go
package user
import (
"go.uber.org/mock/gomock"
"github.com/stretchr/testify/assert"
"testing"
)
func TestUpsertUser(t *testing.T) {
mockCtl := gomock.NewController(t)
defer mockCtl.Finish()
tests := []struct {
name string
user User
specifyFunctionCalls func(mock *MockIUserRepo)
expectedError error
}{
{
user: User{ID: 1, Name: "User 1"},
name: "Should insert",
specifyFunctionCalls: func(mockRepo *MockIUserRepo) {
mockRepo.EXPECT().GetUserByID(1).Return(nil, nil).Times(1)
mockRepo.EXPECT().Insert(User{ID: 1, Name: "User 1"}).Return(nil).Times(1)
},
},
{
name: "User existed - Should update",
user: User{ID: 1, Name: "New User Name"},
specifyFunctionCalls: func(mockRepo *MockIUserRepo) {
mockRepo.EXPECT().GetUserByID(1).Return(&User{ID: 1, Name: "User 1"}, nil).Times(1)
mockRepo.EXPECT().Update(1, User{ID: 1, Name: "New User Name"}).Return(nil).Times(1)
},
},
{
expectedError: invalidUserIDError,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
mockRepo := NewMockIUserRepo(mockCtl)
if test.specifyFunctionCalls != nil {
test.specifyFunctionCalls(mockRepo)
}
userService := UserService{repo: mockRepo}
err := userService.Upsert(test.user)
assert.Equal(t, test.expectedError, err)
})
}
}
在上面的测试文件中:
https://github.com/huantt/gomock-demo
以上就是去模拟的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号