嘲弄mgo链接功能

时间:2017-09-15 16:28:38

标签: go interface mocking mgo

在测试我的一些代码库时,我发现使用接口模拟“gopkg.in/mgo.v2”中的对象很有用。我遇到了mgo.Query没有实现我的接口Query的问题。

import mgo "gopkg.in/mgo.v2"

type Collection interface {
    FindId(interface{}) Query
    Find(interface{}) Query
    UpdateId(interface{}, interface{}) error
    Update(interface{}, interface{}) error
    UpsertId(interface{}, interface{}) (interface{}, error)
    Insert(...interface{}) error
    RemoveId(interface{}) error
}

type Query interface {
    One(interface{}) error
    All(interface{}) error
    Select(interface{}) Query
}

var _ Query = (*mgo.Query)(nil)

查询投射会引发错误:

cannot use (*mgo.Query)(nil) (type *mgo.Query) as type Query in assignment:
    *mgo.Query does not implement Query (wrong type for Select method)
        have Select(interface {}) *mgo.Query
        want Select(interface {}) Query

这是链接功能无法在接口中定义的问题吗?我不确定如何制作一个与mgo实现匹配的Select标头。

1 个答案:

答案 0 :(得分:1)

函数签名不同,这就是您遇到编译错误的原因。您的界面版Select会返回您的 Query类型,而mgo的Select会返回*mgo.Query,这是另一种类型。即使 类型实现了您的界面,功能签名仍然不同。您需要在此处添加另一个图层,以便能够包装mgo包。

type MgoQuery struct {
    *mgo.Query
}

func (q *MgoQuery) Select(selector interface{}) Query {
    return q.Query.Select(selector)
}

...