我们如何使用golang模拟cassandra会话?

时间:2018-06-25 20:11:54

标签: go cassandra gocql

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

2 个答案:

答案 0 :(得分:1)

通常,最好的办法是使用接口而不是真正的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并控制测试的返回值。

接口here

的完整代码示例

答案 1 :(得分:1)

这个问题有点老了,但是我还发现了gockle库,其中包含一个interface的模拟价值驱动程序组件。 README中的gocql库引用了该库。