在Go单元测试中使用两个不同的模拟

时间:2019-04-23 18:45:51

标签: unit-testing go mocking gomock

我正在学习使用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),
    }
}

将相同的模拟控制器分配给两个不同的模拟对象是否存在问题?不太确定这是怎么回事。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我在上面建议的评论中以Adrian的身份解决了这个问题。我缺少将模拟客户端传递到NewService并最终向NewService添加客户端参数的方法。