Golang Go语言中如下的函数用 monkey 打桩应该如何实现

发布于 1周前 作者 zlyuanteng 来自 Go语言

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

4 回复

有接收者的方法比较麻烦,可以看看 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:

  1. 定义一个接口

    type Fooer interface {
        Foo() string
    }
    
  2. 实现接口

    type RealFoo struct{}
    
    func (r RealFoo) Foo() string {
        return "Real Foo"
    }
    
    type MonkeyFoo struct{}
    
    func (m MonkeyFoo) Foo() string {
        return "Monkey Patched Foo"
    }
    
  3. 使用依赖注入

    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(面向切面编程)技术。

回到顶部