当前位置: 首页 > 面试题库 >

Gaolang monkey修补

牛经赋
2023-03-14
问题内容

我知道,如果go代码的结构使其可以编程为接口,那么模拟起来就很简单了。但是,我正在使用无法更改的代码库(不是我的),情况并非如此。

该代码库是高度互连的,并且仅对结构进行编程,而没有对接口进行编程,因此没有依赖项注入。

这些结构本身仅包含其他结构,因此我也无法以这种方式进行模拟。我不相信我可以对方法做任何事情,并且存在的少数几个函数不是变量,所以我不知道如何将它们换出。继承在golang中不是问题,因此也不可行。

在像python这样的脚本语言中,我们可以在运行时(也称为猴子补丁)修改对象。在golang中我可以做一些类似的事情吗?尝试找出某种方式进行测试/基准测试,而无需触及基础代码。


问题答案:

当遇到这种情况时,我的方法是使用自己的接口作为包装程序,从而可以在测试中进行模拟。例如。

type MyInterface interface {
    DoSomething(i int) error
    DoSomethingElse() ([]int, error)
}

type Concrete struct {
    client *somepackage.Client
}

func (c *Concrete) DoSomething(i int) error {
    return c.client.DoSomething(i)
}

func (c *Concrete) DoSomethingElse() ([]int, error) {
    return c.client.DoSomethingElse()
}

现在,您可以以与模拟somepackage.Client接口相同的方式模拟混凝土。

正如@elithrar在下面的注释中指出的那样,您可以嵌入要模拟的类型,因此只需要添加需要模拟的方法即可。例如:

type Concrete struct {
    *somepackage.Client
}

当这样做时,DoSomethingNotNeedingMocking可以直接调用其他方法,Concrete而不必将其添加到接口中或将其模拟出来。



 类似资料:
  • 我正在使用Visual Studio Code进行编码,但最近我遇到了奇怪的问题,该如何解决? 当我输入php artisan tinker时,tinker文本不像往常一样,我记得颜色是蓝色的,但现在是白色的。同样在使用php artisan migrate和etc命令后,结果文本是白色的 我卸载了Vscode以及所有appdata和扩展以及与之相关的任何东西,但在安装最新版本后没有任何变化,修补

  • 使用各种 Photoshop 工具,您可以轻松地修复污点、美白牙齿、修正红眼以及修复图像中的许多其它缺陷。 注意:Photoshop 不支持打开和编辑纸币或钞票图片。请参阅防伪系统 (CDS)。 关于仿制源面板 “仿制源”面板(“窗口”>“仿制源”)具有用于仿制图章工具或修复画笔工具的选项。您可以设置五个不同的样本源并快速选择所需的样本源,而不用在每次更改为不同的样本源时重新取样。您可以查看样本源

  • 说明 支付宝境外到店支付-修改商户二维码 官方文档:https://global.alipay.com/service/merchant_QR_Code/34 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\ModifyMerchantQR\Request 属性 名称 类型 说明 $service string 接口名称 $qrcod

  • 请求地址 https://api.es.xiaojukeji.com/river/Approval/update 返回数据格式 JSON 请求类型 POST 请求参数 参数名称 数据类型 必选 说明 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的access token timestamp string yes 当前

  • 请求地址 https://api.es.xiaojukeji.com/river/Member/edit 返回数据格式 JSON 请求方式 POST 是否需要登录 是 关于登录授权,参见 如何登录授权 访问授权限制 暂无 请求参数 名称 类型 必选 描述 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的access t

  • 请求地址 https://api.es.xiaojukeji.com/river/BudgetCenter/edit 返回数据格式 JSON 请求方式 POST 是否需要登录 是 关于登录授权,参见 如何登录授权 访问授权限制 暂无 请求参数 名称 类型 必选 描述 client_id string yes 申请应用时分配的AppKey access_token string yes 授权后的ac