Вопрос «gomock или testify/mock» встаёт, когда в тестах появляется первый сервис с зависимостью: база, внешний API, очередь. Go не даёт магии рантайма для подмены объектов, поэтому моки строят либо генерацией кода из интерфейсов, либо вручную через встраивание. gomock идёт первым путём: утилита mockgen выдаёт строгую заготовку по интерфейсу, а тест описывает ожидания цепочкой EXPECT. testify/mock идёт вторым: структура с встроенным mock.Mock реализует интерфейс и возвращает заготовленные ответы через On и Return. На этой странице сравним оба по одним критериям, покажем один и тот же мок Store рядом и соберём персональную рекомендацию ползунками важности.
gomock — это дисциплина. Сгенерированный мок знает сигнатуры всех методов: аргументы проверяются матчерами, неожиданный вызов роняет тест, а Times фиксирует, сколько раз метод обязан вызваться. Контроллер завязан на *testing.T, поэтому завершение теста само проверяет все ожидания — забытый вызов базы всплывает без дополнительных assert. Расплата — производственный цикл: интерфейс поменялся — перегенерируй мок, иначе компилятор против; в CI добавляется шаг go generate, а новичок должен понять матчеры вроде gomock.Any и gomock.Eq, прежде чем читать тесты вслух.
testify/mock — это скорость. Структура с встроенным mock.Mock, пара методов с m.Called — и мок готов, без инструментов и генерации. Ожидания описываются в тесте: On привязывает аргументы к ответу, Return задаёт результат, AssertExpectations проверяет, что всё обещанное случилось. Стиль знаком каждому, кто писал моки в динамических языках, и логично продолжает testify-стек: assert, require, suites и моки — один набор зависимостей. Расплата — ручная работа: приведение типов из args.Get, контроль неожиданных вызовов и аккуратность в AssertExpectations, потому что без него тест может пройти, даже если мок не вызвали вовсе.
Как читать итог ниже: оценки — усреднение практики команды проекта, а не замеры; ползунки подставляют ваши приоритеты. Грубая граница: большой проект с десятками интерфейсов и требованиями к строгим проверкам — gomock; быстрый юнит-тест поверх testify-стека — testify/mock; зрелая команда может взять mockery, чтобы получить генерацию моков в стиле testify. Оба подхода разобраны в нашем курсе testify: от знакомства с моками до кодогенерации.