在反射模式下使用模拟



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

我想测试兰德的行为。读取失败。 以下是我想测试的示例。 我想查看日志。测试中执行错误行

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系统应该让我强制"兰特"。阅读"呼吁做正确的事

但是,我无法让模拟工具在"反射"模式下工作

$ $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

我正在使用go 版本 go1.9.2 Linux/amd64 on Ubuntu 14.04

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

我最近遇到了同样的任务。也试图嘲笑,但最终以另一种方式制作。

您可以使函数接受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")
}

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

最新更新