如何模拟嵌套的第三方依赖关系



第三方API使用示例:

fund doSomething(api *api.Client) {
...
result, err := api.Logical().Write(val1, val2)
...
}

我可以用自己的接口处理对Logical()的初始调用

type API interface {
Logical() *api.Logical
}
...
doSomething(&MockAPI{}) // Assuming MockAPI implements API

然而,这现在带来了一个问题:Logical()方法必须具有上述函数签名,否则,我无法用中的实际api对象来代替我的接口。由于*api.Logical类型嵌套在第三方API库中,我不能简单地用另一个接口模拟它:

type Writer interface {
Write(string, string) Result, error
}
type API interface {
Logical() *Writer
}
...
doSomething(&api.Client{}) // Doesn't implement Logical() *Writer

我该如何嘲笑这个API调用,这样我就可以返回自定义数据,而不会访问实时服务?如果有帮助的话,这是基于一个实际的API。

我认为这里最好的答案是完全避免链式函数调用。

type Writer interface {
Write(string, string) Result, error
}
func doSomething(writer Writer) {
...
result, err := writer.Write(val1, val2)
...
}
...
doSomething(api.Client.Logical())

现在我可以实现我自己的Writer并将其用于嘲讽。

最新更新