golang / mock

GoMock is a mocking framework for the Go programming language.
Apache License 2.0
9.26k stars 608 forks source link

Error - Mock method with int and string parameters #19

Closed alvalea closed 8 years ago

alvalea commented 8 years ago

Mocking a method with int and string parameters generates a mock that does not expect those types. However, if both parameters are of type string, it works properly.

output
alem@alem-vm:~/Workspace/go/src/alem/test1$ go test lib_test.go                                                                                                         
--- FAIL: TestMyThing (0.00s)
        controller.go:113: no matching expected call: *mock_mypackage.MockMyInterface.SomeMethod([1 second])
        controller.go:158: missing call(s) to *mock_mypackage.MockMyInterface.SomeMethod(is equal to 1, is equal to second)
        controller.go:165: aborting test due to missing call(s)
FAIL
FAIL    command-line-arguments  0.002s
lib.go
package mypackage

type MyInterface interface {
  SomeMethod(x uint64, y string)
}
lib_test.go
package mypackage

import (
  "testing"
  "alem/test1/lib_mock"
  "github.com/golang/mock/gomock"
)

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

  mockObj := mock_mypackage.NewMockMyInterface(mockCtrl)

  gomock.InOrder(
    mockObj.EXPECT().SomeMethod(1, "second"),
  )

  mockObj.SomeMethod(1, "second")
}
mockgen
mockgen -source=lib.go > lib_mock/lib_mock.go
dsymonds commented 8 years ago

Numeric types in Go are distinct types. An int is not the same as a uint64. When your test writes mockObj.EXPECT().SomeMethod(1, "second") then the 1 becomes a int (since the expectation methods take interface{} args to support matchers), and int(1) is not uint64(1).

Write mockObj.EXPECT().SomeMethod(uint64(1), "second") instead and it should work fine.

alvalea commented 8 years ago

Ok, thank you very much

melkus commented 7 years ago

Why do not generate mock that expects int64 instead of interface{} ? It should be easy, because you already generates real types for Mock object, but not for MockRecorder. Is there any reason you could not allow int64 and other specific types? It could be a flag for mockgen finally.

drscre commented 5 years ago

@melkus Because you can use gomock.Any() or similar constructs instead of concrete values when declaring expectations