使用 gomonkey 遇到非 debug 模式执行失败的问题及解决方法

"本文探讨了在Golang单元测试中,使用gomonkey进行Mock时遇到的问题:正常模式下Patch不生效,而在Debug模式下生效。原因是编译器的自动优化。解决方法是在运行测试时关闭编译器优化,如通过`-gcflags="all=-N-l"`参数。此外,介绍了两种具体的操作方式,并提供了参考资料。"

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

问题描述

基于 Golang 语言,写单元测试,使用gomonkey对于某个函数进行 Mock,遇到如下问题:

  • 使用「正常模式」执行单元测试,Patch不生效,Mock 失败;
  • 使用「Debug模式」执行单元测试,Patch生效,Mock 成功。

说实话,看到这样的现象感觉很怪异,那么,为什么会出现这个问题呢?

解决方法

在网上搜了搜该问题及现象,发现该问题的原因是,

  • 想要使gomonkeyPatch生效,需要关闭编译器对代码的自动优化

但是在「正常模式」下,是没有关闭编译器对代码的自动优化的;而在「Debug模式」下,dlv默认关闭了编译器对代码的自动优化。

因此,想要保证gomonkeyPatch生效,需要关闭编译器的自动优化功能。有两种方法,

  • 方法1go test -gcflags "all=-N -l" ,直接在go test命令行后面加上-gcflags "all=-N -l" 参数;
  • 方法2:使用 GoLand,在Go Test的配置项Go tool arguments中,配置-gcflags "all=-N -l" 参数。

除此之外,大家也可参考「资料1」和「资料2」,里面也描述了该问题的原因及解决方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

安正勋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值