Во-первых, для большинства случаев использование пакета ptest
, вероятно, гораздо более простой подход для тестирования pubsub.Но, конечно, ваш конкретный вопрос может относиться к любой библиотеке, и следующий подход может быть полезен для многих вещей, а не только для насмешек pubsub
.
Ваша более широкая цель - использовать интерфейсы для макетов библиотекикак это, выполнимо.Но это сложно, когда библиотека, которую вы хотите смоделировать, возвращает конкретные типы, которые вы не можете смоделировать (вероятно, из-за незарегистрированных полей).Подход, который нужно использовать, гораздо сложнее, чем он того стоит, поскольку могут быть более простые способы тестирования вашего кода.
Но если вы намерены это сделать, подход, который вы должны предпринять, состоит в том, чтобы неОберните весь пакет в интерфейсы, а не только в конкретные методы, которые вы хотите смоделировать.
Вам нужно будет обернуть все типы, которые вы хотите смоделировать, которые также возвращаются или принимаются вашим интерфейсом.Обычно это означает, что вам также необходимо изменить свой рабочий код (а не только тестовый код), так что иногда это может нарушить условия для существующих баз кода.
Я обычно делал это раньше, когда что-то высмеивалкак драйвер sql стандартной библиотеки, но здесь можно применить тот же подход.По сути, вам нужно создать пакет-обертку для вашей библиотеки pubsub
, которую вы используете даже в своем рабочем коде.Опять же, это может быть довольно навязчиво для существующих кодовых баз, но для иллюстрации.Используя определенные вами интерфейсы:
package mypubsub
import "cloud.google.com/go/pubsub"
type Receiver interface {
Recieve(context.Context, func(context.Context, *pubsub.Message) error)
}
type SubscriptionMaker interface {
Subscription(string) Receiver
}
Затем можно обернуть реализацию по умолчанию для использования в производственном коде:
// defaultClient wraps the default pubsub Client functionality.
type defaultClient struct {
*pubsub.Client
}
func (d defaultImplementation) Subscription(name string) Receiver {
return d.Client.Subscription()
}
Естественно, вам нужно будет расширить этот пакет, чтобы охватить большинствоили весь пакет pubsub
, который вы используете.Это может быть немного утомительно.
Но как только вы это сделаете, используйте пакет mypubsub
везде в своем коде, а не прямо в зависимости от пакета pubsub
.И теперь вы можете легко сменить фиктивную реализацию там, где вам нужно для тестирования.