golang / mock

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

Wrong mock generated for the interface with generics #700

Open heww opened 1 year ago

heww commented 1 year ago

Actual behavior A clear and concise description of what the bug is.

For the interface with generics

type Model[T any] interface {
    *T
    TableName() string
}
type Client[T any, P types.Model[T]] interface {
    Create(*P) error
}

The generated mock is like this

// MockClient is a mock of Client interface.
type MockClient[T any, P types.Model[client.T]] struct {
    ctrl     *gomock.Controller
    recorder *MockClientMockRecorder[T, P]
}

// MockClientMockRecorder is the mock recorder for MockClient.
type MockClientMockRecorder[T any, P types.Model[client.T]] struct {
    mock *MockClient[T, P]
}

// NewMockClient creates a new mock instance.
func NewMockClient[T any, P types.Model[client.T]](ctrl *gomock.Controller) *MockClient[T, P] {
    mock := &MockClient[T, P]{ctrl: ctrl}
    mock.recorder = &MockClientMockRecorder[T, P]{mock}
    return mock
}

Expected behavior A clear and concise description of what you expected to happen.

The argument for the P should be T, not the client.T.

// MockClient is a mock of Client interface.
type MockClient[T any, P types.Model[T]] struct {
    ctrl     *gomock.Controller
    recorder *MockClientMockRecorder[T, P]
}

To Reproduce Steps to reproduce the behavior

  1. git clone https://github.com/heww/gomock-issue.git
  2. go generate ./...

Additional Information

Triage Notes for the Maintainers