如何在golang中模拟函数以获得不同的返回值
问题描述:
我正在为我在golang中开发的函数编写单元测试。这里是代码片段:如何在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
}
}
现在我想嘲笑首先解组返回成功和第二解组返回失败。在Python中,我看到一个类似的帖子: Python mock multiple return values
但我找不到一个golang。任何人都可以请帮我。
答
我在这种情况下会做的是有一个导出的包变量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
不幸的是,这在Golang中并不那么简单。最好的选择是重构你的函数,这样'json.Unmarshal'可以强制返回一个错误,例如当调用'json.Unmarshal(a,&b)'时,a不是json格式。 – Yerken