使用 gomonkey Mock 函数及方法时遇到 panic: permission denied 的问题及解决方法

本文档介绍了在Mac环境下,使用Golang语言和gomonkey库进行函数mock时遇到的权限错误。问题表现为执行单元测试时碰到'panic: permission denied'。解决方法包括下载并替换链接工具,赋予新工具执行权限,以及处理可能出现的克隆和重命名文件的权限问题。此方案适用于遇到类似问题的Golang开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

基于 Golang 语言,使用 gomonkey 来 mock 函数及方法,在 Mac 环境执行的时候,遇到如下错误:

panic: permission denied [recovered]
panic: permission denied

显然,执行单测的时候,遇到了权限问题。

解决方法

按下面顺序依次执行即可。

  • 下载工具
cd `go env GOPATH`
git clone https://github.com/eisenxp/macos-golink-wrapper.git
  • 将 link 重命名为 original_link
mv `go env GOTOOLDIR`/link `go env GOTOOLDIR`/original_link
  • copy 第一步下载的工具到 GOTOOLDIR 目录下
cp `go env GOPATH`/macos-golink-wrapper/link  `go env GOTOOLDIR`/link
  • 授予 link 执行权限
chmod +x `go env GOTOOLDIR`/link

在执行上面的命令的时候,我们有可能遇到两个问题,分别为:

  1. 克隆「git clone https://github.com/eisenxp/macos-golink-wrapper.git」项目超时,无法将项目拉取到本地;
  2. 重命名「mv go env GOTOOLDIR/link go env GOTOOLDIR/original_link」遇到无法授权的问题。

对于第一个问题,我们可以直接去 GitHub 将该项目手动 Download 下来,然后手动复制到「cd go env GOPATH」目录;对于第二个问题,也是手动将遇到的没有权限的目录的权限进行修改。


参考内容

在Go语言中,你可以使用`gomonkey`库来进行接口的模拟(mock)。`gomonkey`是一个用于在测试中进行mock的库,它可以帮助你模拟接口的实现,并在测试过程中替换原始的接口。 下面是一个简单的示例,演示了如何使用`gomonkey`库来模拟接口: ```go package main import ( "fmt" "github.com/agiledragon/gomonkey" ) // 定义一个接口 type MyInterface interface { DoSomething() string } // 实现接口的结构体 type MyStruct struct{} func (m *MyStruct) DoSomething() string { return "Real implementation" } func main() { // 创建一个gomonkey实例 patch := gomonkey.NewPatches() // 创建一个模拟对象 mock := &MyStruct{} // 注册模拟对象到gomonkey实例中 patch.ApplyMethod(reflect.TypeOf(mock), "DoSomething", func(_ *MyStruct) string { return "Mocked implementation" }) // 在函数结束恢复被修改的函数 defer patch.Reset() // 调用被模拟的接口方法 fmt.Println(mock.DoSomething()) // 输出: Mocked implementation } ``` 在上述代码中,我们首先定义了一个接口`MyInterface`和一个实现了该接口的结构体`MyStruct`。然后,我们使用`gomonkey`库创建了一个`Patches`对象,并通过`ApplyMethod`方法将模拟对象注册到该`Patches`对象中。 在`ApplyMethod`函数中,我们指定了要替换的方法,以及一个匿名函数作为替代实现。在这个示例中,我们将`DoSomething`方法的实现替换为返回固定字符串"Mocked implementation"。最后,我们通过调用模拟对象的方法来验证替代实现是否生效。 在函数结束,我们使用`Reset`方法来恢复被修改的函数,以确保不会影响其他部分的测试。 需要注意的是,`gomonkey`库可以用于在测试中模拟函数方法和全局变量,不仅限于接口的模拟。具体使用方式可以根据实际需求进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安正勋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值