Вопрос проверяет знание подводных камней тестирования потоков в корутинах.
Используйте runTest для контроля времени, проверяйте начальные значения и обновления. Для SharedFlow учитывайте буферизацию и отсутствие начального значения.
1. Основные правила:
Запускайте тесты в runTest для управления виртуальным временем.
Проверяйте начальное состояние StateFlow.
Для SharedFlow явно эмитируйте значения перед подпиской или используйте replay.
2. Пример теста для StateFlow:
@Test
fun testStateFlow() = runTest {
val flow = MutableStateFlow(0)
val values = mutableListOf<Int>()
val job = launch { flow.collect { values.add(it) } }
flow.value = 1
assertEquals(listOf(0, 1), values)
job.cancel()
} 3. Пример теста для SharedFlow:
@Test
fun testSharedFlow() = runTest {
val flow = MutableSharedFlow<Int>()
val values = mutableListOf<Int>()
val job = launch { flow.collect { values.add(it) } }
flow.emit(1)
assertEquals(listOf(1), values)
job.cancel()
} Вывод:
Тестируйте потоки в управляемой среде и учитывайте их специфику (буферизацию, горячесть).