在不实现所有方法的情况下使用结构作为接口

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() 方法实现了并且可以调用。

查看相关问题以检测哪些方法是可调用的:

其他相关问题: