如下的函数用 monkey 打桩应该如何实现

2021-01-14 09:13:03 +08:00
 imherer
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 在不改变现有代码的基础上可以实现吗?

1305 次点击
所在节点    Go 编程语言
3 条回复
frozenshadow
2021-01-14 09:26:34 +08:00
有接收者的方法比较麻烦,可以看看 supermonkey,用符号表的方式打 patch
XJohn
2021-01-14 09:45:59 +08:00
可以的,monkey 可以设置桩代码每次调用返回不同的值
js2854
2021-01-25 13:31:21 +08:00
使用 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()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744762

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX