例如,我有20个方法的dao.

type UserDao interface {
    GetUser() (User, error)
    GetUsers() ([]User, error)
    ...
}

我想为测试创建mock,并且只使用一种方法.

type UserDaoMock struct { }

fucn (UserDaoMock) GetUser() (User, error) {
    return User{}
}

在测试中将UserDaoMock用作UserDao之前,有没有一种方法不实现其他方法?告诉编译器应该是这样的?

推荐答案

在模拟 struct 中嵌入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上try ):

{} <nil>

请注意,调用任何其他方法都会引起panic ,因为嵌入的UserDao字段是nil,所以它们后面没有真正的实现.但是UserDaoMock实现了UserDao,而GetUser()方法实现了并且可以调用.

请参阅相关问题以检测哪些方法是可调用的:Go reflection with interface embedded in struct - how to detect "real" functions?

其他相关问题:

Is it possible to define an anonymous interface implementation in Go?

Visibility of embedded private interfaces in Go

Go相关问答推荐

仅呈现一个模板的GIN Web应用程序

更改位置级别和时间戳零点Golang

无法使用Segentio;S Kafka-Go连接到融合的Kafka

Kafka架构注册表-Broker:Broker无法验证记录

如何在gofiber/websocket/v2中设置状态代码和原因

go测试10m后如何避免超时

如何从 nil 指针创建值

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

Go Build删除信息

使用Dockertest进行Golang SQL单元测试的基本设置

在 Go 中使用 Apache Arrow 按时间间隔对事件进行分区

一个Go module可以和之前的非module模块发布在同一个路径下吗?

我如何解码 aes-256-cfb

Golang grpc go.mod 问题

panic :拨号 tcp:在 172.22.64.1:53 上查找 bookstoreDB:没有这样的主机

有没有办法在 golang 中定义可索引类型?

Go Flag 用法 描述 包含 Word 值

泛型:对具有返回自身的函数的类型的约束

如何使用 httputil.ReverseProxy 设置 X-Forwarded-For

Golang 与 Cassandra db 使用 docker-compose:cannot connect (gocql)