【发布时间】:2016-11-30 04:03:30
【问题描述】:
我在 Go 中有一个基本函数,它打开一个文件并尝试解码其 JSON 内容。
我正在尝试提取默认的 json.NewDecoder() 函数,以便在我的测试中轻松地模拟它。
但是,我的实现似乎返回了一个错误:
不能在 NewConfig 的参数中使用 json.NewDecoder (type func(io.Reader) *json.Decoder) 作为类型 decoderFactory
代码:
package main
import (
"encoding/json"
"fmt"
"io"
"os"
)
type openFile func(name string) (*os.File, error)
type decoderFactory func(r io.Reader) decoder
type decoder interface {
Decode(v interface{}) error
}
type Config struct {
ConsumerKey,
ConsumerSecret,
AccessToken,
AccessTokenSecret string
}
func NewConfig(open openFile, d decoderFactory) (*Config, error) {
c := new(Config)
file, err := open("some.file")
if err != nil {
return nil, fmt.Errorf("error opening config file")
}
defer file.Close()
decoder := d(file)
if err := decoder.Decode(&c); err != nil {
return nil, fmt.Errorf("error decoding config JSON")
}
return c, nil
}
func main() {
_, err := NewConfig(os.Open, json.NewDecoder)
if err != nil {
fmt.Fprintf(os.Stderr, "something bad happened: %v\n", err)
}
}
这是Go playground的链接
我哪里错了?
【问题讨论】:
-
解码器是结构体而不是json包中的接口,查看这里golang.org/pkg/encoding/json/#Decoder
标签: pointers testing go interface mocking