Выбор ответа Middle Тесты, бенчмарки и модули спрашивают часто обновлено
Как мокать зависимости в Go
Вопрос
Сервис ходит в платёжный API через структуру *PayClient. Как сделать его тестируемым?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Объявить в сервисе маленький интерфейс, в тесте дать фейк. Неявные интерфейсы позволяют потребителю объявить ровно то, что ему нужно, и подставить фейк или мок (руками или mockgen).
Варианты ответа
- Подменить метод PayClient через monkey patching, это стандарт Go
- Создать глобальную переменную с клиентом и менять её в тестах
- Тестировать только с настоящим API в песочнице провайдера
- Объявить в сервисе маленький интерфейс, в тесте дать фейкправильный ответ
Разбор
Неявные интерфейсы позволяют потребителю объявить ровно то, что ему нужно, и подставить фейк или мок (руками или mockgen). Monkey patching в Go не идиоматичен и требует unsafe-трюков. Глобальные переменные ломают параллельные тесты. Настоящий API для юнит-тестов медленный и ненадёжный, его оставляют для интеграционных тестов или httptest.NewServer.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Тесты, бенчмарки и модули»
- Minimal version selection как в Go modules
- Упрощённый go mod tidy: лишние и недостающие модули
- Сортировка версий по Semantic Versioning на Go
- Что выведет Go: табличный прогон без testing
- testing.B.Loop в Go 1.24
- Что показывает -benchmem
- t.Errorf и t.Fatalf
- Команда запуска тестов с детектором гонок