Skip to content

Generating mocks (reflect mode) fails if interface contains methods with generic types #175

@yz89122

Description

@yz89122

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

Same issue from github.com/golang/mock golang/mock#677.

Interface:

package mypkg

type S struct{}

type GS[T any] struct {
	T T
}

type I interface {
	M() GS[*S]
}

Mock package:

package mypkgmock

//go:generate go run go.uber.org/mock/mockgen -destination=mock.go -package=$GOPACKAGE github.com/yz89122/gomock-test/mypkg I

Command:

go generate ./...
2024/04/24 06:33:24 Failed to format generated source code: mock.go:42:39: missing ',' in type argument list (and 1 more errors)
// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/yz89122/gomock-test/mypkg (interfaces: I)
//
// Generated by this command:
//
//      mockgen -destination=mock.go -package=mypkgmock github.com/yz89122/gomock-test/mypkg I
//

// Package mypkgmock is a generated GoMock package.
package mypkgmock

import (
        mypkg "github.com/yz89122/gomock-test/mypkg"
        gomock "go.uber.org/mock/gomock"
        reflect "reflect"
)

// MockI is a mock of I interface.
type MockI struct {
        ctrl     *gomock.Controller
        recorder *MockIMockRecorder
}

// MockIMockRecorder is the mock recorder for MockI.
type MockIMockRecorder struct {
        mock *MockI
}

// NewMockI creates a new mock instance.
func NewMockI(ctrl *gomock.Controller) *MockI {
        mock := &MockI{ctrl: ctrl}
        mock.recorder = &MockIMockRecorder{mock}
        return mock
}

// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockI) EXPECT() *MockIMockRecorder {
        return m.recorder
}

// M mocks base method.
func (m *MockI) M() mypkg.GS[*github.com/yz89122/gomock-test/mypkg.S] {
        m.ctrl.T.Helper()
        ret := m.ctrl.Call(m, "M")
        ret0, _ := ret[0].(mypkg.GS[*github.com/yz89122/gomock-test/mypkg.S])
        return ret0
}

// M indicates an expected call of M.
func (mr *MockIMockRecorder) M() *gomock.Call {
        mr.mock.ctrl.T.Helper()
        return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "M", reflect.TypeOf((*MockI)(nil).M))
}
exit status 1

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

No error.

To Reproduce Steps to reproduce the behavior

  1. Run go generate ./... for above code.

Additional Information

  • gomock mode (reflect or source): reflect
  • gomock version or git ref: v0.4.0
  • golang version: 1.22.2

Triage Notes for the Maintainers

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions