2017-06-14 101 views
0

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

+0

不幸的是,这在Golang中并不那么简单。最好的选择是重构你的函数,这样'json.Unmarshal'可以强制返回一个错误,例如当调用'json.Unmarshal(a,&b)'时,a不是json格式。 – Yerken

回答

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

相关问题