Table of Contents |
---|
How To
We will start by creating a mock object. It must implement all the functions of the object we are trying to mock.
In the struct, we will add testify's mock object.
Add "mock.Mock" to your type:
Code Block |
---|
import (
" |
Example Mock Class
Code Block |
---|
package mock import ( "credential-management/src/internal/dao" internalErrors "credential-management/src/internal/error" "credential-management/src/internal/model" "github.com/stretchr/testify/mock" ) type MockDaoClientMyMock struct { mock.Mock } type MockTransaction struct { mock.Mock ... } func (m *MockDaoClientMyMock) Connect ListTopics() ([]string, error ){ args := m.Called() return args.ErrorGet(0) } func (m *MockDaoClient) Disconnect() error { args.([]string), args.Error(1) } ... |
In our Test Case
Code Block |
---|
kafkaTopics := []string{"topic1", "topic2", "topic3"} mock := mmock.CalledNewMockClusterAdmin() mock.On("ListTopics").Return(kafkaTopics, nil).Once() |
By adding .Once() at the end of the mock.On call, we can call mock.On again.
Sample Test Case
Code Block |
---|
package consumer import ( "errors" "github.com/Shopify/sarama" "github.com/stretchr/testify/assert" "kafka-azure-sink/src/internal/mock" "slices" "testing" ) return args.Error(0) } func TestSuccessAdditionOfKafkaTopics(mt *MockDaoClienttesting.T) NewTransaction() (dao.Transaction, error) { args := m.Called() return new(MockTransaction), args.Error(0) } func (m *MockDaoClient) InsertLookup(tr dao.Transaction, credentialLookup *model.CredentialLookup) *internalErrors.CredentialError { args := m.Called(tr, credentialLookup) return ConvertCredError(args.Get(0)) } func (m *MockDaoClient) UpdateLookup(tr dao.Transaction, credentialLookup *model.CredentialLookup) *internalErrors.CredentialError { args := m.Called(tr, credentialLookup) return ConvertCredError(args.Get(0)) } func (m *MockDaoClient) GetLookupById(tr dao.Transaction, id string) (*model.CredentialLookup, *internalErrors.CredentialError) { args := m.Called(tr, id) return args.Get(0).(*model.CredentialLookup), ConvertCredError(args.Get(1)) } func (m *MockDaoClient) GetLookup(tr dao.Transaction, searchCriteria map[string]interface{}, pageInfo *dao.PageInfo) ([]*model.CredentialLookup, *internalErrors.CredentialError) { args := m.Called(tr, searchCriteria) return args.Get(0).([]*model.CredentialLookup), ConvertCredError(args.Get(1)) } func (m *MockDaoClient) GetLookupCount(tr dao.Transaction, searchCriteria map[string]interface{}) (int64, *internalErrors.CredentialError) { args := m.Called(tr, searchCriteria) return int64(args.Get(0).(int)), ConvertCredError(args.Get(1)) } func (m *MockDaoClient) DeleteLookup(tr dao.Transaction, id string) *internalErrors.CredentialError { args := m.Called(tr, id) return ConvertCredError(args.Get(0)) } func (tr *MockTransaction) Commit() error { return nil } func (tr *MockTransaction) Abort() error { return nil } func ConvertCredError(arg interface{}) *internalErrors.CredentialError { if e, ok := arg.(*internalErrors.CredentialError); ok { return e } return nil }{ baseTopics := []string{"ncyd_kubernetes", "etlflow_*"} kafkaTopics := []string{"ncyd_test1", "etlflow_ssh", "etlflow_nrd"} initialKafkaTopics := buildTopicMap(kafkaTopics) mock := mock.NewMockClusterAdmin() mock.On("ListTopics").Return(initialKafkaTopics, nil).Once() topicManager, err := NewTopicManager(mock, baseTopics, 1) assert.Nil(t, err) topics := topicManager.GetTopicList() assert.True(t, slices.Contains(topics,baseTopics[0])) assert.True(t, slices.Contains(topics,kafkaTopics[1])) assert.True(t, slices.Contains(topics,kafkaTopics[2])) //add a kafka topic kafkaTopics = append(kafkaTopics, "etlflow_newTopic") revisedKafkaTopics := buildTopicMap(kafkaTopics) mock.On("ListTopics").Return(revisedKafkaTopics, nil).Once() //scan for new topic newTopic, err := topicManager.scanForNewTopics() assert.Nil(t, err) assert.True(t, newTopic) } func TestFailureInitializationError(t *testing.T) { baseTopics := []string{"ncyd_kubernetes", "etlflow_*"} emptyMap := buildTopicMap([]string{}) mock := mock.NewMockClusterAdmin() mock.On("ListTopics").Return(emptyMap, errors.New("error")).Once() _, err := NewTopicManager(mock, baseTopics, 1) assert.NotNil(t, err) } func buildTopicMap(kafkaTopics []string) map[string]sarama.TopicDetail { topicMap := make(map[string]sarama.TopicDetail) for _, topic := range kafkaTopics { tp := sarama.TopicDetail{} topicMap[topic] = tp } return topicMap } ... |
Sample Mock Class
Code Block |
---|
package mock
import (
"github.com/Shopify/sarama"
"github.com/stretchr/testify/mock"
)
type MockClusterAdmin struct{
mock.Mock
topics []string
}
func NewMockClusterAdmin() *MockClusterAdmin{
mockClusterAdmin := &MockClusterAdmin{}
return mockClusterAdmin
}
func (m *MockClusterAdmin) ListTopics() (map[string]sarama.TopicDetail, error){
args := m.Called()
return args.Get(0).(map[string]sarama.TopicDetail), args.Error(1)
}
...
|