【发布时间】:2021-11-19 06:46:51
【问题描述】:
我是 golang 新手,来自 java 背景。
这是我今天的问题:如何对使用不提供 Golang 接口的第三方库的组件进行单元测试?这是我的具体例子:
我有一个类使用 golang mongodb 驱动来实现一些 DB 操作,如下所示:
package mypackage
type myClientBeingTested struct {
client *mongo.Client
}
func (mc *myClientBeingTested) FindOne(filter interface{}) (*mongo.SingleResult, error) {
result := mc.client.FindOne(context.Background(), filter)
if result.Err() == mongo.ErrNoDocuments {
return nil, nil
} else {
return nil, Errors.New("My own error message")
}
return result, nil
}
现在我想为这个方法编写一些单元测试,并意识到不可能模拟没有接口实现的第三方依赖项。在上面的示例中,mongo.Client 是 struct 类型。经过一番研究和思考,唯一可能的方法似乎如下:
package mypackage
type myClientBeingTested struct {
client *mongo.Client
}
var findOneFunc = func(client *mongo.Client, ctx context.Context, filter interface{}) (*mongo.SingleResult, error) {
return client.findOne(ctx, filter)
}
func (mc *myClientBeingTested) FindOne(filter interface{}) (*mongo.SingleResult, error) {
result := findOneFunc(mc.client, filter)
if result.Err() == mongo.ErrNoDocuments {
return nil, nil
} else {
return nil, Errors.New("My own error message")
}
return result, nil
}
然后在我的单元测试中,我可以使用我自己的存根来存根findOneFunc,如下所示
findOneFunc = func(client *mongo.Client, ctx context.Context, filter interface{}) (*mongo.SingleResult, error) {
// my own implementation
}
但这似乎是一个 hack。是否有任何真实/推荐的方式来处理这种情况?感谢您的回复!
【问题讨论】:
-
“意识到不可能模拟没有接口实现的第三方依赖”,这在 Java 中是正确的,而不是在 Go 中。接口是隐式实现的,因此不需要在实现中定义它们。看看Tour of Go,特别是关于接口的部分。
标签: unit-testing go