使用Gomock进行测试会返回错误:预期的呼叫已被呼叫最大次数

时间:2018-07-06 08:49:58

标签: unit-testing testing go gomock

我正在使用Gomock randrange和嘲笑

此测试的源代码为:

package sqs

import (
    "errors"
    "testing"

    "path_to_the_mocks_package/mocks"
    "github.com/golang/mock/gomock"

    "github.com/aws/aws-sdk-go/service/sqs"
)


func TestPollWhenNoMessageOnQueue(t *testing.T) {
    mockCtrl := gomock.NewController(t)
    defer mockCtrl.Finish()

    msgr := mocks.NewMockMessenger(mockCtrl)
    mq := make([]*sqs.Message, 1)
    err := errors.New("Mock Error")
    // msgr.EXPECT().GetMessage().Return(mq, err) //.Times(1)
    // msgr.GetMessage().Return(mq, err) //.Times(1)
    msgr.EXPECT().GetMessage().Return(mq, err)

    p := NewPoller(msgr)
    done := make(chan bool)
    go p.Poll(done)
    <-done
    t.Logf("Successfully done: %v", done)
}

此源文件的测试用例在这里:

type mockMessenger struct {
    mock.Mock
}

func (m *mockMessenger) GetMessage() ([]*sqs.Message, error) {
    msgs := make([]*sqs.Message, 0)
    err := errors.New("Error")
    return msgs, err
}

运行测试时,出现以下错误:

  

sqs \ controller.go:150:意外呼叫   * path_to_mocks_package / mocks / mock_messenger.go:mocks.MockMessenger.GetMessage([]):38,因为:预期   在path_to_sqs_package / sqs / sqs_test.go处调用:35已被调用   最大次数。失败

如果我按如下所示编写自己的模拟,则测试用例将成功执行:

<T> T[] toArray(T[] a);

1 个答案:

答案 0 :(得分:6)

您暗中告诉gomock,您只希望接到一个电话。

msgr.EXPECT().GetMessage().Return(mq, err)

在模拟中添加多个Times,可以多次返回这些值。

msgr.EXPECT().GetMessage().Return(mq, err).AnyTimes()