I am trying to use mockgen for using gomock writing some unit test cases
Method I want to test
// Create - inserts data into mongo database
func Create(dbName, collectionName string, d interface{}) error {
mongo, err := GetS(dbName)
if err != nil {
return err
}
defer mongo.Close()
err = mongo.DB(dbName).C(collectionName).Insert(d)
if err != nil {
return err
}
return nil
}```
func GetS(dbName string) (*mgo.Session, error) {
ctx := apiContext.TContext{}
url, err := connectionURLList.get(dbName)
if err != nil {
log.GenericWarning(ctx,
fmt.Sprintf(“connection to %s not yet created, creating one: %v”, dbName, err), nil)
if err := connectMongo(dbName); err == nil {
return GetS(dbName) //singleton recursion to again call GetS
}
return nil, err
}
// ignoring error, expected we will always setting session in session map
session, _ := connectionList.get(url)
return session.Copy(), err
}
Interface
package doers
type MongoManager interface {
GetS(tenantName string) error
}
mock implementation
```// Code generated by MockGen. DO NOT EDIT.
// Source: ../doers (interfaces: MongoManager)
// Package mocks is a generated GoMock package.
package mocks
import (
gomock "github.com/golang/mock/gomock"
reflect "reflect"
)
// MockMongoManager is a mock of MongoManager interface
type MockMongoManager struct {
ctrl *gomock.Controller
recorder *MockMongoManagerMockRecorder
}
// MockMongoManagerMockRecorder is the mock recorder for MockMongoManager
type MockMongoManagerMockRecorder struct {
mock *MockMongoManager
}
// NewMockMongoManager creates a new mock instance
func NewMockMongoManager(ctrl *gomock.Controller) *MockMongoManager {
mock := &MockMongoManager{ctrl: ctrl}
mock.recorder = &MockMongoManagerMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
func (m *MockMongoManager) EXPECT() *MockMongoManagerMockRecorder {
return m.recorder
}
// GetS mocks base method
func (m *MockMongoManager) GetS(arg0 string) error {
ret := m.ctrl.Call(m, "GetS", arg0)
ret0, _ := ret[0].(error)
return ret0
}
// GetS indicates an expected call of GetS
func (mr *MockMongoManagerMockRecorder) GetS(arg0 interface{}) *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetS", reflect.TypeOf((*MockMongoManager)(nil).GetS), arg0)
}
testing
func TestCreate(t *testing.T) {
var d document
d.Book = "myBooks"
d.Subject = "mySubject"
d.IsActive = true
mockCtrl := gomock.NewController(t)
mongoMock := mocks.NewMockMongoManager(mockCtrl)
errConnect := connectMongo("mydb")
if errConnect == nil {
addr, err := connectionList.connect("mydb")
if err != nil {
t.Error(err)
} else {
connectionURLList.set("mydb", addr)
err := mongoMock.EXPECT().GetS("mydb").Return(nil)
if err != nil {
t.Error("invalid ")
} else {
err := Create("mydb" ,"books" , d)
if err != nil {
t.Error(err)
}
}
}
}
}
Output
charles@Apples-MacBook-Pro-2 mongoManager (CDMS-6671) $ go test
— FAIL: TestCreate (0.00s)
collection_test.go:42: invalid
FAIL
exit status 1
FAIL bitbucket.org/tekion/tbaas/mongoManager 0.067s