2

问:有什么方法可以使用 go 模拟 casssandra 会话,而无需实际连接到任何键空间/模式/数据库。我们可以模拟 cassandra 进行单元测试吗?

4

2 回答 2

4

一般来说,最好的办法是使用接口而不是真正的 cassandra 库实现。

你没有包括一个例子,所以我在下面创建:

type Service struct {
    session *gocql.Session
}

func (s *Service) Tweets() {

    var id gocql.UUID
    var text string

    q := `SELECT id, text FROM tweet WHERE timeline = ? LIMIT 1`
    if err := s.session.Query(q, "me").Consistency(gocql.One).Scan(&id, &text); err != nil {
        log.Fatal(err)
    }
    fmt.Println("Tweet:", id, text)

}

在此示例中,我们使用方法接收器中的s.session字段。*Service

除了直接使用会话之外,我们还可以创建允许我们稍后创建模拟的接口。

// SessionInterface allows gomock mock of gocql.Session
type SessionInterface interface {
    Query(string, ...interface{}) QueryInterface
}

// QueryInterface allows gomock mock of gocql.Query
type QueryInterface interface {
    Bind(...interface{}) QueryInterface
    Exec() error
    Iter() IterInterface
    Scan(...interface{}) error
}

现在我们更新的代码可能如下所示:

type Service struct {
    session SessionInterface
}

这意味着我们可以SessionInterface使用模拟实现来实现并控制返回值以进行测试。

接口的完整代码示例在这里

于 2018-06-25T20:51:37.293 回答
2

这个问题有点老了,但我还找到了gockle库,其中包含一个interface用于模拟价值的驱动程序组件。该库由READMEgocql中的库引用。

于 2020-03-12T15:15:14.323 回答