From cf84652c4d42dffbcd2805e0942167362c11d280 Mon Sep 17 00:00:00 2001 From: fantasticbin Date: Wed, 29 May 2024 11:02:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=96=AD=E8=A8=80=E5=BA=93?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=8F=8A=E5=A2=9E=E5=8A=A0gomock=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 15 ++++++++--- gomock/demo.go | 11 +++++++++ gomock/demo_test.go | 59 ++++++++++++++++++++++++++++++++++++++++++++ gomock/mock_user.go | 54 ++++++++++++++++++++++++++++++++++++++++ gomock/user.go | 10 ++++++++ routine/pool_test.go | 2 +- 6 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 gomock/demo.go create mode 100644 gomock/demo_test.go create mode 100644 gomock/mock_user.go create mode 100644 gomock/user.go diff --git a/go.mod b/go.mod index 3626eef..07d0a13 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,15 @@ module go-study go 1.20 require ( - github.com/brildum/testify v0.0.0-20151105045740-d05693e2e501 // indirect - github.com/marusama/cyclicbarrier v1.1.0 // indirect - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect - golang.org/x/sync v0.5.0 // indirect + github.com/marusama/cyclicbarrier v1.1.0 + github.com/stretchr/testify v1.9.0 + golang.org/x/exp v0.0.0-20240119083558-1b970713d09a + golang.org/x/sync v0.5.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.uber.org/mock v0.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/gomock/demo.go b/gomock/demo.go new file mode 100644 index 0000000..c98b0a8 --- /dev/null +++ b/gomock/demo.go @@ -0,0 +1,11 @@ +package gomock + +func GetUserName(us UserService, id int) (string, error) { + // 使用依赖注入进来的具体结构体方法,通常为需要mock的方法 + user, err := us.GetUser(id) + if err != nil { + return "", err + } + + return user.Name, nil +} diff --git a/gomock/demo_test.go b/gomock/demo_test.go new file mode 100644 index 0000000..61b3df6 --- /dev/null +++ b/gomock/demo_test.go @@ -0,0 +1,59 @@ +package gomock + +import ( + "errors" + "github.com/stretchr/testify/assert" + "testing" + + "go.uber.org/mock/gomock" +) + +func TestGetUserName(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockUserService := NewMockUserService(ctrl) + + // 定义测试用例 + testCases := []struct { + name string + userID int + mockSetup func() + expected string + err error + }{ + { + name: "valid user", + userID: 1, + mockSetup: func() { + mockUserService.EXPECT(). + GetUser(1). + Return(&User{ID: 1, Name: "Alice"}, nil) + }, + expected: "Alice", + err: nil, + }, + { + name: "user not found", + userID: 2, + mockSetup: func() { + mockUserService.EXPECT(). + GetUser(2). + Return(nil, errors.New("user not found")) + }, + expected: "", + err: errors.New("user not found"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tc.mockSetup() + + result, err := GetUserName(mockUserService, tc.userID) + + assert.Equal(t, tc.expected, result) + assert.Equal(t, tc.err, err) + }) + } +} diff --git a/gomock/mock_user.go b/gomock/mock_user.go new file mode 100644 index 0000000..4dbf0e7 --- /dev/null +++ b/gomock/mock_user.go @@ -0,0 +1,54 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: gomock/user.go +// +// Generated by this command: +// +// mockgen -source=gomock/user.go -destination=gomock/mock_user.go -package=gomock +// + +// Package gomock is a generated GoMock package. +package gomock + +import ( + reflect "reflect" + + gomock "go.uber.org/mock/gomock" +) + +// MockUserService is a mock of UserService interface. +type MockUserService struct { + ctrl *gomock.Controller + recorder *MockUserServiceMockRecorder +} + +// MockUserServiceMockRecorder is the mock recorder for MockUserService. +type MockUserServiceMockRecorder struct { + mock *MockUserService +} + +// NewMockUserService creates a new mock instance. +func NewMockUserService(ctrl *gomock.Controller) *MockUserService { + mock := &MockUserService{ctrl: ctrl} + mock.recorder = &MockUserServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockUserService) EXPECT() *MockUserServiceMockRecorder { + return m.recorder +} + +// GetUser mocks base method. +func (m *MockUserService) GetUser(id int) (*User, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUser", id) + ret0, _ := ret[0].(*User) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUser indicates an expected call of GetUser. +func (mr *MockUserServiceMockRecorder) GetUser(id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUser", reflect.TypeOf((*MockUserService)(nil).GetUser), id) +} diff --git a/gomock/user.go b/gomock/user.go new file mode 100644 index 0000000..5f73b8d --- /dev/null +++ b/gomock/user.go @@ -0,0 +1,10 @@ +package gomock + +type User struct { + ID int + Name string +} + +type UserService interface { + GetUser(id int) (*User, error) +} diff --git a/routine/pool_test.go b/routine/pool_test.go index 0044e55..cf6d7e3 100644 --- a/routine/pool_test.go +++ b/routine/pool_test.go @@ -7,7 +7,7 @@ import ( "sync/atomic" "testing" - "github.com/brildum/testify/assert" + "github.com/stretchr/testify/assert" ) func TestPool(t *testing.T) {