2017-06-14 45 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

相關問題