如何模拟一个函数来在golang中获取不同的返回值

时间:2017-06-14 16:50:43

标签: unit-testing go mocking

我正在为golang开发的函数编写单元测试。以下是代码段:

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    
    }
}

现在我想先模仿unmarshal来返回成功,然后第二次unmarshal来返回失败。在python中,我看到一个类似的帖子: Python mock multiple return values

但我找不到一个golang。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:2)

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

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