on the implementor side of an API "for mocking"; instead, design the API so that it can be tested using the public API of the real implementation.
// DO NOT DO IT!!!
package producer
type Thinger interface { Thing() bool }
type defaultThinger struct{ … }
func (t defaultThinger) Thing() bool { … }
func NewThinger() Thinger { return defaultThinger{ … } }
Instead return a concrete type and let the consumer mock the producer implementation.
package producer
type Thinger struct{ … }
func (t Thinger) Thing() bool { … }
func NewThinger() Thinger { return Thinger{ … } }
А как тогда изолировать в тестах код использующий Thinger от кода самого Thinger и как его мокать, если это реальная структура, а не интерфейс?
объявлять интерфейс в пакете, где этот интерфейс используется
Объявлять интерфейс ближе к тому месту где он используется, а не там где он реализуется - это логично. IoC и все такое. Мне показалось, что есть какая-то такая хитрая реализация, где можно не тестировать чужой функционал и при этом не использовать интерфейсы. Вот это "design the API so that it can be tested using the public API of the real implementation." смущает.
Обсуждают сегодня