go - 如何模拟嵌套的第三方依赖项?
问题描述
第三方 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
并将其用于模拟。
推荐阅读
- javascript - 如何使用我的 firefox-addon 进行持久的 DOM 更改?
- rust - WindowCreationError“无法创建输入上下文”对 libEGL 和 ggez 意味着什么?
- r - 为什么 R 在创建矩阵时需要交错值?
- json - 如何在 Python 中打开多个 json 文件?
- java - 延迟初始化健全性检查:变量可能尚未初始化
- rabbitmq - MassTransit / RabbitMQ - 为什么跳过这么多消息?
- excel - 查找一行中 3 个连续阳性单元格中第一个的列号
- c# - 在自定义工具窗口的用户控件中使用数据绑定
- python - 如何使用 Numpy.gradient 制作正确的渐变图
- react-native - 如何修复“需要未知模块“573”。在反应原生?