I had to restructure my code to pass a valiadtor to the function under 
test. That fixed the issue.

On Friday, October 14, 2022 at 12:47:39 PM UTC-4 Ron Khera wrote:

> I am using Go 1.19 on a windows machine with 8 cores, operating system is 
> Windows 10 Pro. I used the mockgen tool to generate the mock.When I debug 
> my test I see the mocked method is recorded when I execute the EXPECT() 
> function.The mocked function is called,  but test fails with 'missing call' 
> on the mocked function.
>
> Can anyone please point what I am doing wrong ?
>
> Directory Structure :
> cmd
>  configure.go
>  configure_test.go
> mocks
>   mock_validator.go
> validator
>   validator.go
> user
>   user.go 
> go.mod
> main.go 
> --
> * Contents of main.go
> package main
> import (
>                 "localdev/mockexample/cmd"
> )
> func main() {
>                 cmd.Configure()
> }
> * Contents of configure.go
> package cmd
> import (
>                 "fmt"
>                 "localdev/mockexample/user"
>                 "os"
>                 "localdev/mockexample/validator"
> )
> var (
>                 name, password string
> )
> func Configure() {
>                 name := os.Args[1]
>                 password := os.Args[2]
>                 user, err := validate(validator.NewValidator(name, 
> password))
>                 if err != nil {
>                                 fmt.Printf("%v\n", err)
>                                 return
>                 }
>                 fmt.Printf("Credentials are valid. Welcome: %s %s\n", 
> user.FirstName, user.LastName)
> }
> func validate(validator validator.Validator) (*user.Data, error) {
>                 user, err := validator.ValidateUser()
>                 if err != nil {
>                                 return nil, fmt.Errorf("some thing went 
> wrong. %v", err)
>                 }
>                 return user, nil
> }
> * Contents of validator.go
> package validator
> import (
>                 "fmt"
>                 "localdev/mockexample/user"
> )
> //go:generate mockgen -destination=../mocks/mock_validator.go 
> -package=mocks localdev/mockexample/validator Validator
> type Validator interface {
>                 ValidateUser() (*user.Data, error)
> }
> type ValidationRequest struct {
>                 Command  string
>                 Name     string
>                 Password string
> }
> func (vr ValidationRequest) ValidateUser() (*user.Data, error) {
>                 if vr.Name == "bob" && vr.Password == "1234" {
>                                 return &user.Data{UserID: "123", UserName: 
> "bsmith", FirstName: "Bob", LastName: "Smith"}, nil
>                 }
>                 return nil, fmt.Errorf("invalid credentials")
> }
> func NewValidator(name string, password string) Validator {
>                 return &ValidationRequest{Name: name, Password: password}
> }
> * Contents of user.go
> package user
> type Data struct {
>                 UserID    string `json:"user_id"`
>                 UserName  string `json:"user_name"`
>                 FirstName string `json:"first_name"`
>                 LastName  string `json:"last_name"`
> }
> * Contents of configure_test.go
> package cmd
> import (
>                 "localdev/mockexample/mocks"
>                 "localdev/mockexample/user"
>                 "os"
>                 "testing"
>  
>                 "github.com/golang/mock/gomock"
> )
> func TestConfigure(t *testing.T) {
>                 t.Run("ConfigureWithMock", func(t *testing.T) {
>                                 os.Args[1] = "bob"
>                                 os.Args[2] = "1234"
>  
>                                 ctrl := gomock.NewController(t)
>                                 mockValidator := 
> mocks.NewMockValidator(ctrl)
>                                 
> //mockValidator.EXPECT().ValidateUser().AnyTimes() // zero more calls, so 
> this will also pass.
>                                 userData := user.Data{UserID: "testId"}
>                                 
> mockValidator.EXPECT().ValidateUser().Return(&userData, nil).Times(1) 
> //(gomock.Any(), gomock.Any()) //(&userData, nil)
>                                 Configure()
>                 })
> }
> Contents of generated mock
> // Code generated by MockGen. DO NOT EDIT.
> // Source: localdev/mockexample/validator (interfaces: Validator)
> // Package mocks is a generated GoMock package.
> package mocks
> import (
>                 user "localdev/mockexample/user"
>                 reflect "reflect"
>                 gomock "github.com/golang/mock/gomock"
> )
> // MockValidator is a mock of Validator interface.
> type MockValidator struct {
>                 ctrl     *gomock.Controller
>                 recorder *MockValidatorMockRecorder
> }
> // MockValidatorMockRecorder is the mock recorder for MockValidator.
> type MockValidatorMockRecorder struct {
>                 mock *MockValidator
> }
> // NewMockValidator creates a new mock instance.
> func NewMockValidator(ctrl *gomock.Controller) *MockValidator {
>                 mock := &MockValidator{ctrl: ctrl}
>                 mock.recorder = &MockValidatorMockRecorder{mock}
>                 return mock
> }
> // EXPECT returns an object that allows the caller to indicate expected 
> use.
> func (m *MockValidator) EXPECT() *MockValidatorMockRecorder {
>                 return m.recorder
> }
> // ValidateUser mocks base method.
> func (m *MockValidator) ValidateUser() (*user.Data, error) {
>                 m.ctrl.T.Helper()
>                 ret := m.ctrl.Call(m, "ValidateUser")
>                 ret0, _ := ret[0].(*user.Data)
>                 ret1, _ := ret[1].(error)
>                 return ret0, ret1
> }
> // ValidateUser indicates an expected call of ValidateUser.
> func (mr *MockValidatorMockRecorder) ValidateUser() *gomock.Call {
>                 mr.mock.ctrl.T.Helper()
>                 return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, 
> "ValidateUser", reflect.TypeOf((*MockValidator)(nil).ValidateUser))
> }
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/fab942d2-cf5d-42fb-84db-6451398e13f6n%40googlegroups.com.

Reply via email to