我正在为使用golang开发的功能编写单元测试。 这是代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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模拟多个返回值

但是我找不到一个适合golang的人。 谁能帮我这个忙。

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

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

1
2
3
4
5
var Unmarshaller func(data []byte, v interface{}) error;

func init() {
    Unmarshaller = json.Unmarshal
}

然后,当您想强加一个错误时,您可以

1
2
3
mypackage.Unmarshaller = func(data[] byte, v interface{}) error {
    return errors.New("It broke!")
}

然后,在代码中,而不是直接调用json.Unmarshal,而是调用程序包级别的`Unmarshaller,因此

1
err =: json.Unmarshal(jsonBytes, &test)

会成为

1
err =: Unmarshaller(jsonBytes, &test)

简短示例:https://play.golang.org/p/CinLmprtp5