【问题标题】:How to mock a function to get a different return value in golang如何在golang中模拟一个函数以获取不同的返回值
【发布时间】:2017-11-16 22:40:04
【问题描述】:

我正在为我在 golang 中开发的函数编写单元测试。这是代码sn-p:

func myFunc () {
    //there is some code
    err := json.Unmarshal (a, &b)
    if err != nil {
        //handle error    
    }

    //there is some more code

    err := json.Unmarshal (c, &d)
    if err != nil {
        //handle error    
    }
}

现在我想模拟第一个解组返回成功,第二个解组返回失败。在 python 中,我看到了一篇类似的帖子: Python mock multiple return values

但是我找不到 golang 的。谁能帮我解决这个问题。

【问题讨论】:

  • 不幸的是,这在 Golang 中并不是那么简单。最好的办法是重构您的函数,以便可以强制使 json.Unmarshal 返回错误,例如当调用json.Unmarshal(a, &b) 并且 a 不是 json 格式时。

标签: unit-testing go mocking


【解决方案1】:

在这种情况下我会做的是有一个导出的包变量Unmarshaller 并在init() 方法中将其设置为json.Unmarshal

var Unmarshaller func(data []byte, v interface{}) error;

func init() {
    Unmarshaller = json.Unmarshal
}

然后,当你想强制出错时,你可以这样做

mypackage.Unmarshaller = func(data[] byte, v interface{}) error {
    return errors.New("It broke!")
}

然后,在你的代码中,不是直接调用json.Unmarshal,而是调用你的包级别`Unmarshaller,所以

err =: json.Unmarshal(jsonBytes, &test)

会变成

err =: Unmarshaller(jsonBytes, &test)

作为一个简短的例子:https://play.golang.org/p/CinLmprtp5

【讨论】:

    猜你喜欢
    • 2021-02-14
    • 2020-02-20
    • 2018-03-04
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多