Представьте: вы пишете тест для экрана Логина.
Вы нажимаете «Войти» в коде теста -> идет запрос на реальный сервер -> сервер отвечает 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
