unit-testing - 如何模拟函数以在golang中获得不同的返回值

标签 unit-testing go mocking

我正在为我在 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 的。谁能帮我解决这个问题。

最佳答案

在这种情况下我会做的是导出一个包变量 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

关于unit-testing - 如何模拟函数以在golang中获得不同的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44550509/

相关文章:

json - Go:JSON 输入意外结束,json.Unmarshal 返回 nil 值

go - 雨果帖子不显示

mocking - 模拟 Spring 组件

javascript - Angular Controller Mock 在我的 Mocha 测试中没有持续存在

c# - 如何检查是否在 Mock 对象上调用了特定的属性 setter ?

go - 如何从Fluentd日志中删除日期时间和标签?

php - 如何在 PHP 单元测试中模拟在构造函数中调用的方法?

ruby-on-rails - ruby : Alter class static method in a code block

iOS 测试套件 - 添加整个项目源进行测试

algorithm - 应用于私有(private)方法的单元测试