gogomockmongomock

gomock, Go,mango package ,MongoMock


I am trying to mock the below method using gomock

func GetS(tenantName string) (*mgo.Session, error) {
    ctx := apiContext.TContext{}
    url, err := connectionURLList.get(tenantName)
    if err != nil {
        log.GenericWarning(ctx,
            fmt.Sprintf("connection to %s not yet created, creating one: %v", tenantName, err), nil)
        if err := connectMongo(tenantName); err == nil {
            return GetS(tenantName) //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
}

My Interface

type MongoManager interface {
    GetS(tenantName string) 
}

func TestGetS(t *testing.T) {
    //var mgoCall *mgo.Session
    mockCtrl := gomock.NewController(t)
    defer mockCtrl.Finish()
    mockManagerObj := mocks.NewMockMongoManager(mockCtrl)
    mockManagerObj.EXPECT().GetS("cacargroup").Return(nil)
}

I am Getting the below error . Can someone help

 $ go test

--- FAIL: TestGetS (0.00s) mongoManager_test.go:20: missing call(s) to *mocks.MockMongoManager.GetS(is equal to cacargroup) /Users/charles/workspace/src/bitbucket.org/tekion/tbaas/mongoManager/mongoManager_test.go:16 mongoManager_test.go:20: aborting test due to missing call(s) FAIL exit status 1


Solution

  • You see actually the method in your interface implemented with return type of an error. But you are using like it returns nothing and chaining the implementation. Just remove the return type of GetS.

    type fn func(string) (*mgo.Session, error)
    
    type MongoManager interface {
        NewFunction(GetS, "cascade")
    }
    
    func TestGetS(t *testing.T) {
        //var mgoCall *mgo.Session
        mockCtrl := gomock.NewController(t)
        defer mockCtrl.Finish()
        mockManagerObj := mocks.NewMockMongoManager(mockCtrl)
        mockManagerObj.EXPECT().GetS("cacargroup").Return(nil)
    }
    

    Also you have to remove it from GetS function too

    func NewFunction(GetS fn, value string){
       GetS("cascade")
    }
    
    func GetS(tenantName string) (*mgo.Session, error){
        ctx := apiContext.TContext{}
        url, err := connectionURLList.get(tenantName)
        if err != nil {
            log.GenericWarning(ctx,
                fmt.Sprintf("connection to %s not yet created, creating one: %v", tenantName, err), nil)
            if err := connectMongo(tenantName); err == nil {
                return GetS(tenantName) //singleton recursion to again call GetS
            }
            return nil, err
        }
        // ignoring error, expected we will always setting session in session map
        session, _ := connectionList.get(url)
    }