go - 在反射模式下使用mockgen

标签 go gomock

我正在尝试为现有库编写一些测试,但无法让 gomock 工作

我想测试 rand.Read 失败时的行为。这是我想测试的示例。我想看到 log.Error 行在测试中执行

import (
     "crypto/rand"
)
    func GetRandomBytes(n int) ([]byte, error) {

        b := make([]byte, n)
        _, err := rand.Read(b)

        if err != nil {
            log.Error("Failed to get entropy from system", err)
            return nil, err
        }

        return b, nil
    }

gomock 系统应该让我强制“rand.Read”调用做正​​确的事情

但是,我无法让mockgen工具在“reflect”模式下工作

$ $GOPATH/bin/mockgen 'crypto/rand' Read
# command-line-arguments
./prog.go:22:28: invalid indirect of "crypto/rand".Read (type func([]byte) (int, error))
2018/01/21 11:20:30 Loading input failed: exit status 2

我正在使用 Ubuntu 14.04 上的 go 版本 go1.9.2 linux/amd64

genmock -prog_only 'crypto/rand' Read 工作正常,但它生成的代码看起来对我需要做的事情没有用

最佳答案

我最近也有同样的任务。也尝试过mock,但最终以另一种方式制作。

您可以创建一个接受Read函数并返回目标函数GetRandomBytes的函数。喜欢:

func MakeRandomBytesGetter(fn func([]byte) (int,error)) func(int)([]bute,error) {
    return func(n int) ([]byte, error) {

        b := make([]byte, n)
        _, err := fn(b)

        if err != nil {
            log.Error("Failed to get entropy from system", err)
            return nil, err
        }

        return b, nil
    }
}

var (
    GetRamdomBytes = MakeRandomBytesGetter(rand.Read)
)

对于测试,您可以使用具有相同签名但行为不同的不同函数。喜欢:

func FailRead(n int) ([]byte, error) {
    return []byte{}, fmt.Errorf("Read failed")
}

并检查您的函数在出现此类错误时的行为。

关于go - 在反射模式下使用mockgen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366328/

相关文章:

unit-testing - 测试和模拟一个不返回任何值的函数

json - 相当于Python的json.dumps和json.loads

mongodb - 简单查询的上下文

go - 在繁忙循环的 goroutine 中休眠

list - 如何检查 slice 是否在 GO 中的 slice 内?

go - 展示内容,如幻灯片或印象

go - 解决 mockgen 的导入包冲突

go - 查找模块的版本

go - 在 TestMain 中使用 testing.T

go - 如何在 golang 中模拟 memcached 进行单元测试?