我正在学习使用 gomock 的 mockgen 实用程序第一次在 Go 中使用 mock 进行单元测试。我的单元测试工作正常,除了其中一个。被测方法有两个依赖项:一个依赖于数据库,另一个依赖于它调用 rest api 的外部服务。数据库的模拟 (mockRepo) 工作正常,因为被测方法正确调用模拟而不是实际的 repo 代码。然而,rest 客户端的 mock 继续调用实际的 rest 客户端而不是 mock 代码。我不知道为什么。有人可以解释原因并帮助修复吗?
这是我的单元测试:
func TestService_CreateWorkspace(t *testing.T) {
ts := NewTestService(t)
defer ts.mockCtrl.Finish()
ts.mockClient.EXPECT().POST(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(&http.Response{StatusCode: 200}, nil)
testWs := TestWorkspaces()["max-ws"]
ts.mockRepo.EXPECT().Create(testWs).Times(1).Return(&testWs, nil)
ws, err := ts.service.CreateWorkspace(&testWs)
assert.Equal(t, testWs, ws)
assert.NoError(t, err)
}
这是 NewTestService 的代码:
type TestService struct {
mockCtrl *gomock.Controller
mockClient *MockRestClient
mockRepo *MockRepository
service Service
}
func NewTestService(t *testing.T) *TestService {
mockCtrl := gomock.NewController(t)
mockRepo := NewMockRepository(mockCtrl)
mockClient := NewMockRestClient(mockCtrl)
return &TestService{
mockCtrl: mockCtrl,
mockClient: mockClient,
mockRepo: mockRepo,
service: NewService(mockRepo),
}
}
将同一个模拟 Controller 分配给两个不同的模拟对象是否存在问题?不太确定这里发生了什么。任何帮助表示赞赏。
最佳答案
我在上面建议的评论中以 Adrian 的身份解决了这个问题。我缺少一种将模拟客户端传递到 NewService 的方法,最终向 NewService 添加了一个客户端参数。
关于unit-testing - 在 Go 单元测试中使用两个不同的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55817579/