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