我正在使用 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
我可以知道我在這里做錯了什么還是這是預期的行為?謝謝。
uj5u.com熱心網友回復:
根據您的描述,Foo是一個介面,并*mockFoo實作了該Foo介面。因此,無論何時Foo需要 a,您都可以使用*mockFoo.
型別map[string]Foo與型別不同map[string]*mockFoo。兩者都是具體型別(它們不是介面),因此您不能用一種替換另一種。
但是,您可以使用map[string]Foo,并將*mockFoo值放入該映射中,就我從您的代碼中看到的而言,這就是您應該做的。將地圖宣告為map[string]Foo,并使用其中的*mockFoo值。如果需要將地圖的值參考為*mockFoo,則可以對地圖值進行型別-assert 來獲取該*mockFoo值,即:
fooMap=map[string]Foo{}
fooMap["key"]=mockFoo1
...
value:=foomap["key"].(*mockFoo)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/316786.html
