我正在使用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。使用模拟 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]*mockFoomap[string]Foovar foo1 Foovar mockFoo1 *mockFoofoo1 = mockFoo1 // no problemvar fooMap map[string]Foovar mockFooMap map[string]*mockFoofooMap = mockFooMap // problematic我能知道我在这里是否做错了什么,或者这是否是预期的行为吗?谢谢。
1 回答

回首忆惘然
TA贡献1847条经验 获得超11个赞
根据您的描述,是一个接口,并实现该接口。因此,每当需要 时,都可以使用 。Foo*mockFooFooFoo*mockFoo
类型 与 类型 不同。两者都是具体类型(它们不是接口),因此不能用一个替换另一个。map[string]Foomap[string]*mockFoo
但是,您可以使用 ,并将值放入该映射中,根据我从您的代码中看到的情况,这是您应该做的。将映射声明为 ,并在其中使用值。如果需要将映射的值引用为 ,则可以键入断言映射值以获取该值,即:map[string]Foo*mockFoomap[string]Foo*mockFoo*mockFoo*mockFoo
fooMap=map[string]Foo{}
fooMap["key"]=mockFoo1
...
value:=foomap["key"].(*mockFoo)
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报
0/150
提交
取消