私が歌川です

@utgwkk が書いている

mockgenのreflect modeで型引数を取る型を返すメソッドのあるinterfaceのモックを生成できない

表題が全てです。たとえば以下のように定義されている I interfaceのモックをmockgenのreflect modeで生成するとエラーになる。

package generic

import (
    "go.uber.org/mock/sample/imp1"
)

type V[T any] map[string]T

type I interface {
    X() V[imp1.Imp1]
}

エラーメッセージをよく見ると、X メソッドの返り値の型が generic.V[imp1.Imp1] ではなく generic.V[go.uber.org/mock/sample/imp1.Imp1] という型になっていておかしい。これは reflect.Type 型の Name() メソッドがこういう文字列を返すことに起因している。

github.com

このissueでも言及されているように、2023/10/3 時点ではGoの reflect.Type からジェネリックな型の引数の情報を取得するインタフェースは提供されていない。proposalはある。

github.com

type VImp1 V[imp1.Imp1] のように型を定義してあげれば回避できる。あとはreflect modeではなくsource modeだとちゃんと動く。

ここで緊急アンケート

みなさまはGoのinterfaceのモックに何を使っていますか?