猿问

戈莫克不能使用类型映射*mockFoo 作为映射[字符串]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。使用模拟 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]Foo


var foo1 Foo

var mockFoo1 *mockFoo

foo1 = mockFoo1 // no problem


var fooMap map[string]Foo

var mockFooMap map[string]*mockFoo

fooMap = mockFooMap // problematic

我能知道我在这里是否做错了什么,或者这是否是预期的行为吗?谢谢。


红糖糍粑
浏览 103回答 1
1回答

回首忆惘然

根据您的描述,是一个接口,并实现该接口。因此,每当需要 时,都可以使用 。Foo*mockFooFooFoo*mockFoo类型 与 类型 不同。两者都是具体类型(它们不是接口),因此不能用一个替换另一个。map[string]Foomap[string]*mockFoo但是,您可以使用 ,并将值放入该映射中,根据我从您的代码中看到的情况,这是您应该做的。将映射声明为 ,并在其中使用值。如果需要将映射的值引用为 ,则可以键入断言映射值以获取该值,即:map[string]Foo*mockFoomap[string]Foo*mockFoo*mockFoo*mockFoofooMap=map[string]Foo{}fooMap["key"]=mockFoo1...value:=foomap["key"].(*mockFoo)
随时随地看视频慕课网APP

相关分类

Go
我要回答