首页 > 解决方案 > 如何模拟嵌套的第三方依赖项?

问题描述

第三方 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

标签: gotestinginterfacemocking

解决方案


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

type Writer interface {
    Write(string, string) Result, error
}

func doSomething(writer Writer) {
    ...
    result, err := writer.Write(val1, val2)
    ...
}

...

doSomething(api.Client.Logical())

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


推荐阅读