在不实现所有方法的情况下使用结构作为接口
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>
请注意,调用任何其他方法当然会出现 panic,因为嵌入的 UserDao
字段是 nil
,因此它们背后没有真正的实现。但是 UserDaoMock
确实实现了 UserDao
,并且 GetUser()
方法实现了并且可以调用。
查看相关问题以检测哪些方法是可调用的:
其他相关问题:
例如我有 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>
请注意,调用任何其他方法当然会出现 panic,因为嵌入的 UserDao
字段是 nil
,因此它们背后没有真正的实现。但是 UserDaoMock
确实实现了 UserDao
,并且 GetUser()
方法实现了并且可以调用。
查看相关问题以检测哪些方法是可调用的:
其他相关问题: