例如,我有 20 種方法的 dao。
type UserDao interface {
GetUser() (User, error)
GetUsers() ([]User, error)
...
}
我想為測驗創建模擬并且只使用一種方法。
type UserDaoMock struct { }
fucn (UserDaoMock) GetUser() (User, error) {
return User{}
}
有沒有辦法在測驗中使用 UserDaoMock 作為 UserDao 之前不實作其他方法?告訴編譯器它應該是這樣的嗎?
uj5u.com熱心網友回復:
將介面嵌入到UserDao
您的模擬結構中,因此它將提升所有方法。僅實作您需要的方法(實際呼叫的方法):
type UserDao interface {
GetUser() (User, error)
GetUsers() ([]User, error)
}
type UserDaoMock struct {
UserDao
}
func (UserDaoMock) GetUser() (User, error) {
return User{}, nil
}
測驗它:
var dao UserDao
dao = UserDaoMock{}
fmt.Println(dao.GetUser())
哪個會輸出(在Go Playground上試試):
{} <nil>
請注意,呼叫任何其他方法當然會恐慌,因為嵌入的UserDao
欄位是nil
,所以它們背后沒有真正的實作。但是UserDaoMock
確實實作UserDao
了,并且該GetUser()
方法已實作并且是可呼叫的。
請參閱相關問題以檢測哪些方法是可呼叫的:Go reflection with interface embedded in struct - how to detect "real" functions?
其他相關問題:
是否可以在 Go 中定義匿名介面實作?
Go 中嵌入式私有介面的可見性
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483073.html