0Pricing
Jetpack Compose Academy · Урок

Тестирование ViewModels и потоков

Тестируйте логику модульно с тестовыми диспетчерами.

«Тестирование ViewModels и потоков» — бесплатный урок Jetpack Compose Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Jetpack Compose Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Jetpack Compose Academy содержит 4 уроков всего.

Части этого урока еще не переведены и отображаются на английском.

Test Logic Without the UI

A ViewModel holds your screen logic, so you can test it directly with plain JUnit. No emulator or rendering needed, which makes these tests fast. ⚡

Arrange, Act, Assert

ViewModel tests follow a simple rhythm: create the ViewModel, call a function, then assert the new state. Keep each test focused on one behavior.

val vm = CounterViewModel()
vm.increment()
assertEquals(1, vm.count)

The Coroutine Challenge

Many ViewModels launch coroutines, which run on Dispatchers.Main. In tests there is no main looper, so you must swap in a test dispatcher instead.

StandardTestDispatcher

A StandardTestDispatcher gives you full control over coroutine timing. Tasks queue up and run only when you advance the virtual clock.

val dispatcher = StandardTestDispatcher()

Replace the Main Dispatcher

Use Dispatchers.setMain before each test to inject your test dispatcher, then call resetMain afterward to leave global state clean.

Dispatchers.setMain(dispatcher)

runTest

Wrap suspending test bodies in runTest. It provides a coroutine scope with a virtual clock so delays resolve instantly, not in real seconds.

@Test fun loads() = runTest {
    // suspend calls run here
}

Quick Check

Your ViewModel launches coroutines on the main dispatcher. What lets a unit test control their execution?

Advancing the Clock

With a StandardTestDispatcher, queued coroutines wait. Call advanceUntilIdle inside runTest to run them all, then check the final state.

advanceUntilIdle()
assertEquals(Loaded, vm.uiState.value)

Testing a StateFlow

ViewModels often expose a StateFlow. Its current snapshot lives in .value, so you can read and assert it directly after advancing the clock.

assertEquals(0, vm.count.value)

Collecting Flow Emissions

To capture a sequence of emissions, the Turbine library makes Flow testing easy with awaitItem, asserting each value as it arrives.

vm.events.test {
    assertEquals(Saved, awaitItem())
}

Fake Your Dependencies

Inject a fake repository that returns canned data. This keeps tests fast and lets you simulate success and error paths without a real network.

val vm = NewsViewModel(FakeRepo())

Clean Teardown

Always pair setMain with resetMain in your teardown. Leaving a test dispatcher installed can leak into and break other tests in the suite.

@After fun tearDown() {
    Dispatchers.resetMain()
}

Recap: ViewModels & Flows

Test logic without UI by swapping in a test dispatcher, running code in runTest, and asserting StateFlow values. Fast, focused, reliable tests. 🏁

Часто задаваемые вопросы

Урок «Тестирование ViewModels и потоков» бесплатный?

Да — полный текст урока «Тестирование ViewModels и потоков» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Jetpack Compose Academy, подпишись на CoddyKit PRO. Курс Jetpack Compose Academy содержит 4 уроков всего.

Чему я научусь в уроке «Тестирование ViewModels и потоков»?

Тестируйте логику модульно с тестовыми диспетчерами. Ты практикуешь Jetpack Compose Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Jetpack Compose Academy?

Предыдущий опыт не требуется. Jetpack Compose Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Тестирование ViewModels и потоков»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Jetpack Compose Academy?

Да. Каждый урок Jetpack Compose Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. createComposeRule и средства поиска
  2. Проверки и выполнение действий
  3. Семантика и тестовые метки
  4. Тестирование ViewModels и потоков
← Назад к Jetpack Compose Academy