Golang Go语言中如下的函数用 monkey 打桩应该如何实现
Golang Go语言中如下的函数用 monkey 打桩应该如何实现
func(svc Service) Test(){
info, err := svc.GetInfo()
if err != nil{
return
}
// 拿到 info 做一些其他逻辑,并把 info 更新
// …
// 再拿一次最新的 info
info, err := svc.GetInfo()
if err != nil{
return
}
}
抛开合不合理先不谈,我现在想实现第一次 GetInfo 不返回 error 而第二次 GetInfo 返回 error 应该如何实现? 主要是为了覆盖率。。。。
或者除了 monkey 在不改变现有代码的基础上可以实现吗?
更多关于Golang Go语言中如下的函数用 monkey 打桩应该如何实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
有接收者的方法比较麻烦,可以看看 supermonkey,用符号表的方式打 patch
更多关于Golang Go语言中如下的函数用 monkey 打桩应该如何实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可以的,monkey 可以设置桩代码每次调用返回不同的值
使用 gomonkey: github.com/agiledragon/gomonkey
p := ApplyMethodSeq(svc, “GetInfo”, []OutputCell{
{Values: Params{info, nil}}, // 第 1 次不返回 error
{Values: Params{nil, errors.New(“mock error”)}}, // 第 2 次不返回 error
})
defer p.Reset()
在Go语言中,使用“monkey patching”(打桩)技术通常是为了在运行时修改函数或方法的行为。虽然Go语言本身并不直接支持像Python那样的monkey patching,但我们可以通过一些技巧实现类似的效果,比如使用接口和依赖注入。
假设你有一个函数foo
,你希望在运行时修改它的行为。以下是一个简化的示例,展示如何通过接口和依赖注入来模拟monkey patching:
-
定义一个接口:
type Fooer interface { Foo() string }
-
实现接口:
type RealFoo struct{} func (r RealFoo) Foo() string { return "Real Foo" } type MonkeyFoo struct{} func (m MonkeyFoo) Foo() string { return "Monkey Patched Foo" }
-
使用依赖注入:
func main() { var fooer Fooer = RealFoo{} fmt.Println(fooer.Foo()) // 输出: Real Foo // “打桩” fooer = MonkeyFoo{} fmt.Println(fooer.Foo()) // 输出: Monkey Patched Foo }
通过这种方式,你可以在运行时改变fooer
的实现,从而模拟monkey patching的效果。注意,这种方法依赖于接口和依赖注入的使用,因此在设计系统时应考虑这些原则,以便更容易地进行这种修改。对于更复杂的场景,可能需要更复杂的依赖注入框架或AOP(面向切面编程)技术。