TGViewer
Мобильная разработка #1 Мобильная разработка #1 @developer_mobila · 3.81K subscribers
Post #1727 668
🎭 Искусство обмана: Зачем нужны Mock-объекты (и почему без них тесты - мусор)

Представьте: вы пишете тест для экрана Логина.
Вы нажимаете «Войти» в коде теста -> идет запрос на реальный сервер -> сервер отвечает 200 OK -> тест проходит.

На следующий день у вас пропал интернет. Или бэкенд упал. Или Вася с бэкенда поменял JSON.
Ваш тест упал 🔴.
Но ваш код Логина не менялся и работает правильно!

Это Flaky Test (Хрупкий тест). Он проверяет не вашу логику, а погоду на Марсе (доступность сервера).

🛡 Решение: Mocking (Мокирование)

В Unit-тестах мы должны тестировать классы в изоляции.
Ваш ViewModel / Presenter не должен знать, что существует настоящий сервер или база данных. Ему нужно подсунуть «куклу» (Mock).

Как это работает (на пальцах):

1. У вас есть интерфейс AuthRepository.
2. В реальном приложении вы используете NetworkAuthRepository (который ходит в сеть).
3. В тесте вы создаете Mock этого репозитория.

Что умеет Mock:
Вы говорите ему: "Слушай, когда у тебя вызовут метод login("admin", "123"), не ходи ни в какую сеть. Просто верни мне Success мгновенно" (или Error, если хотите проверить обработку ошибок).

🛠 Инструменты Мидла:

🤖 Android (Kotlin):
Забудьте про Mockito (он из мира Java). Используйте MockK.


// Создаем мок
val repository = mockk<AuthRepository>()

// Обучаем его (Stubbing)
coEvery { repository.login(any(), any()) } returns Result.Success(User("Max"))

// Тестируем ViewModel
viewModel.onLoginClicked()

// Проверяем, что метод был вызван (Verification)
coVerify { repository.login("admin", "pass") }



🍏 iOS (Swift):
В Swift часто пишут моки вручную (создают класс MockAuthRepo, реализующий протокол), так как рефлексия ограничена.
Либо используют генераторы: Sourcery или Cuckoo.
Суть та же:


class MockAuthRepo: AuthRepository {
var loginResult: Result<User, Error>?

func login(...) {
return loginResult! // Возвращаем то, что настроили заранее
}
}



💡 Главная мысль:
Unit-тесты должны работать без интернета, без эмулятора и выполняться за миллисекунды. Если ваш тест идет 5 секунд - это не Unit-тест.

А какой процент покрытия кода тестами (Code Coverage) в вашем проекте? (Если 0% - не стесняйтесь, ставьте 🌚) 👇

#testing #unit #mockk #android #ios #quality #middle

👉 @developer_mobila
  • 👍 1
More from @developer_mobila
  1. Sep 14, 2026Как разрабатывать приложения для iPhone на iPad Звучит как противоречие: iPad стал вполне…
  2. Aug 24, 2026🧪 Как заставить XCUITest работать с интерфейсом глубиной более 100 уровней Инженеры Циана…
  3. Jul 25, 2026🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.r…
  4. Jul 8, 2026🕵️‍♂️ «Я спрятал ключ в константу»: Как Джуны дарят доступы хакерам Вы интегрировали крут…
  5. Jun 25, 2026👾 Androguard: Швейцарский нож для реверс-инжиниринга Android Если вы занимаетесь пентесто…
  6. Jun 22, 2026Живой космос на Metal: как я переписывал фон мобильной игры и поднимал FPS с 20 до 120 В м…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →