我正在学习使用gomock的mockgen实用程序第一次在Go中使用模拟进行单元测试。除了其中之一,我的单元测试工作正常。被测方法有两个依赖项:一个依赖于数据库,另一个依赖于对其进行rest api调用的外部服务。数据库的模拟(mockRepo)可以正常工作,因为被测方法可以正确调用模拟,而不是实际的repo代码。但是,其余客户端的模拟继续调用实际的其余客户端,而不是模拟代码。我不知道为什么。有人可以解释原因并帮助解决吗?
这是我的单元测试:
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),
}
}
将相同的模拟控制器分配给两个不同的模拟对象是否存在问题?不太确定这是怎么回事。任何帮助表示赞赏。
答案 0 :(得分:0)
我在上面建议的评论中以Adrian的身份解决了这个问题。我缺少将模拟客户端传递到NewService并最终向NewService添加客户端参数的方法。