第三方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
并将其用于嘲讽。