Ответ
В Go мокирование часто делается с помощью интерфейсов и ручного или автоматического создания моков (например, через mockgen из gomock).
Пример ручного мока:
type DB interface {
GetUser(id int) (string, error)
}
type MockDB struct{}
func (m *MockDB) GetUser(id int) (string, error) {
return "test_user", nil
}
func TestService(t *testing.T) {
mockDB := &MockDB{}
service := NewService(mockDB)
// тестируем...
}
Автоматические моки (gomock):
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockDB := NewMockDB(ctrl)
mockDB.EXPECT().GetUser(1).Return("test_user", nil)
Популярные инструменты:
gomock(официальный от Google)testify/mock(проще, но менее строгий)mockery(генерация моков по интерфейсам)
Ключевое — изолировать зависимости через интерфейсы и заменять их в тестах.