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

标签 unit-testing go mocking gomock

我正在学习使用 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/

相关文章:

java - 测试(模拟)一个 void 函数,该函数在内部调用其他与数据库创建连接的函数

javascript - 我如何模拟 AngularJS 单元测试中 promise 的结果?

javascript - 如何监视服务以测试它 -- AngularJS/Jasmine

c# - EF Core、EF 6 和不同的测试方法

go - 在包之间使用相同结构的类型断言

mongodb - 使用 mgo 检索嵌套文档

java - 模拟库调用

java - 服务对象没有用数据模拟?

java - 如何使用 Mockito 模拟 forEach 行为

go - 管理 Multi-Tenancy ArangoDB 连接