![](/img/trans.png)
[英]SimpleInjector resolving all types implementing an interface without explicitly binding
[英]Go use struct as interface without implementing all methods
例如,我有 20 种方法的 dao。
type UserDao interface {
GetUser() (User, error)
GetUsers() ([]User, error)
...
}
我想为测试创建模拟并且只使用一种方法。
type UserDaoMock struct { }
fucn (UserDaoMock) GetUser() (User, error) {
return User{}
}
有没有办法在测试中使用 UserDaoMock 作为 UserDao 之前不实现其他方法? 告诉编译器它应该是这样的吗?
将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?
其他相关问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.