在反射模式下使用 mockgen
Using mockgen in reflect mode
我正在尝试为现有库编写一些测试,但无法让 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
我正在使用
go version go1.9.2 linux/amd64 on Ubuntu 14.04
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")
}
并在出现此类错误时检查您的功能行为。
我正在尝试为现有库编写一些测试,但无法让 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
我正在使用 go version go1.9.2 linux/amd64 on Ubuntu 14.04
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")
}
并在出现此类错误时检查您的功能行为。