Ответ вслух Middle Тестирование спрашивают часто обновлено

Как ты тестируешь ViewModel

Вопрос

Расскажи, как ты тестируешь ViewModel с корутинами и Flow.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

ViewModel тестирую локальными тестами на JVM, это быстро. Сначала JUnit-правило подменяет Dispatchers.Main на StandardTestDispatcher, потому что viewModelScope работает на Main, которого в JVM нет.

Что должно прозвучать в ответе

  • Локальный 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 ошибок.