Как ты тестируешь ViewModel
Вопрос
Расскажи, как ты тестируешь ViewModel с корутинами и Flow.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Локальный JUnit-тест без устройства
Подмена Dispatchers.Main тестовым через правило
runTest и виртуальное время, advanceUntilIdle
Фейковые репозитории вместо моков
Проверка StateFlow.value или Turbine для последовательности
Внедряемые диспетчеры вместо захардкоженных
Что могут спросить следом
- Как протестировать stateIn(WhileSubscribed)?
- Как проверить состояние загрузки до результата?
Разбор
ViewModel тестирую локальными тестами на JVM, это быстро. Сначала JUnit-правило подменяет Dispatchers.Main на StandardTestDispatcher, потому что viewModelScope работает на Main, которого в JVM нет. Зависимости передаю в конструктор: фейковый репозиторий, который хранит данные в памяти и может по флагу бросить ошибку. Тест пишу в runTest, тогда задержки и таймауты проходят мгновенно на виртуальном времени. Сценарий простой: создал ViewModel, вызвал действие, продвинул планировщик advanceUntilIdle, проверил state.value. Если важна последовательность состояний, например сначала загрузка, потом данные, использую Turbine и awaitItem(). Если состояние построено через stateIn(WhileSubscribed), без подписчика оно не стартует, поэтому запускаю коллектор в backgroundScope. Диспетчеры IO внутри репозиториев внедряю, чтобы в тестах подставить тестовый.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.