Gomock 不能使用类型 map[string]*mockFoo 作为 map[string]foo
Gomock cannot use type map[string]*mockFoo as map[string]foo
我正在使用 gomock,我有这段示例代码想要测试。
type StructA struct {
client map[string]Foo
}
type Foo interface {
foo.methodFoo() string
}
func (a *structA) MethodA(name string) string {
client := a.client[name]
return client.methodFoo()
}
在我的测试中,我为 foo 生成了一个模拟,称为 mockFoo。使用 mockgen v1.6.0 为接口 foo 生成模拟。
我的测试代码为:
func Test_MethodA(t *testing.T) {
type fields struct {
client map[string]*mockFoo
}
tests := []struct {
fields fields
want string
}
{
// test cases
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
a := &StructA {
client: tt.fields.client //this has an error, saying that we cannot use map[string]*mockFoo as the type map[string]foo
}
...
})
}
}
TLDR 是 map[string]*mockFoo
不能用作类型 map[string]Foo
。
var foo1 Foo
var mockFoo1 *mockFoo
foo1 = mockFoo1 // no problem
var fooMap map[string]Foo
var mockFooMap map[string]*mockFoo
fooMap = mockFooMap // problematic
我可以知道我在这里做错了什么或者这是预期的行为吗?谢谢。
根据您的描述,Foo
是一个接口,*mockFoo
实现了Foo
接口。因此,每当需要 Foo
时,您可以使用 *mockFoo
.
类型 map[string]Foo
与类型 map[string]*mockFoo
不同。两者都是具体类型(它们不是接口),因此您不能用一个代替另一个。
但是,您可以使用 map[string]Foo
,并将 *mockFoo
值放入该映射中,据我从您的代码中可以看出,这就是您应该做的。将映射声明为 map[string]Foo
,并在其中使用 *mockFoo
值。如果需要将map的值引用为*mockFoo
,可以对map值进行type-assert获取*mockFoo
值,即:
fooMap=map[string]Foo{}
fooMap["key"]=mockFoo1
...
value:=foomap["key"].(*mockFoo)
我正在使用 gomock,我有这段示例代码想要测试。
type StructA struct {
client map[string]Foo
}
type Foo interface {
foo.methodFoo() string
}
func (a *structA) MethodA(name string) string {
client := a.client[name]
return client.methodFoo()
}
在我的测试中,我为 foo 生成了一个模拟,称为 mockFoo。使用 mockgen v1.6.0 为接口 foo 生成模拟。
我的测试代码为:
func Test_MethodA(t *testing.T) {
type fields struct {
client map[string]*mockFoo
}
tests := []struct {
fields fields
want string
}
{
// test cases
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
a := &StructA {
client: tt.fields.client //this has an error, saying that we cannot use map[string]*mockFoo as the type map[string]foo
}
...
})
}
}
TLDR 是 map[string]*mockFoo
不能用作类型 map[string]Foo
。
var foo1 Foo
var mockFoo1 *mockFoo
foo1 = mockFoo1 // no problem
var fooMap map[string]Foo
var mockFooMap map[string]*mockFoo
fooMap = mockFooMap // problematic
我可以知道我在这里做错了什么或者这是预期的行为吗?谢谢。
根据您的描述,Foo
是一个接口,*mockFoo
实现了Foo
接口。因此,每当需要 Foo
时,您可以使用 *mockFoo
.
类型 map[string]Foo
与类型 map[string]*mockFoo
不同。两者都是具体类型(它们不是接口),因此您不能用一个代替另一个。
但是,您可以使用 map[string]Foo
,并将 *mockFoo
值放入该映射中,据我从您的代码中可以看出,这就是您应该做的。将映射声明为 map[string]Foo
,并在其中使用 *mockFoo
值。如果需要将map的值引用为*mockFoo
,可以对map值进行type-assert获取*mockFoo
值,即:
fooMap=map[string]Foo{}
fooMap["key"]=mockFoo1
...
value:=foomap["key"].(*mockFoo)