В общем, лучше всего использовать интерфейсы вместо реальной реализации библиотеки Кассандры.
Вы не включили пример, который я создал ниже:
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
с помощью фиктивной реализации и контролировать возвращаемые значения для тестирования.
Fullпример кода интерфейсов здесь