douye2020 2017-08-09 17:03
浏览 54

用接口模拟数据库返回类型

How to correctly mock some *sql.DB methods for unit testing using interfaces? For example, I want to have a Store struct that is used as a datasource for my handlers. It has a conn field that is the *sql.DB. But in my tests I want to mock the DB, so I try to return not the actual *sql.Rows but an interface that the *sql.Rows should satisfy. Here is the code:

type TestRows interface {
    Scan ()
}

type TestDB interface {
    Query (query string, args ...interface{}) (TestRows, error) 
}

type Rows struct {
    //..
}

func (r *Rows) Scan () {
    fmt.Println("Scanning")
}

This is the *sql.DB

type DB struct {
    //...
}

func (d *DB) Query (query string, args ...inteface{}) (*Rows, error) {
    return &Rows{/* .... */}, nil
}

And when I want to instantiate the Store, it throws error

type Store struct {
    conn TestDB
}

func main() { 
    cl := Store {conn: &DB{}}
    fmt.Println("Hello, playground")
}

cannot use DB literal (type *DB) as type TestDB in field value:
    *DB does not implement TestDB (wrong type for Query method)
        have Query(string) (*Rows, error)
        want Query(string) (TestRows, error)
  • 写回答

2条回答 默认 最新

  • doupaoshu8334 2017-08-09 17:39
    关注

    The definition of Query function needs to be:

    func (d *DB) Query(query string, args ...interface{}) (TestRows, error) {
        return &Rows{count: 1}, nil
    }
    

    Edit:

    If as -- you pointed out -- you can't change the implementation of the Query function because you need to meet other interfaces, then you need to adjust your own interfaces. In this case

    type TestDB interface {
        Query(query string, args ...interface{}) (*Rows, error)
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值