我正在为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。任何人都可以帮助我。
答案 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