Kotlin coroutines использует продукты и mockito, чтобы издеваться над производственной работой

Я тестирую Kotlin coroutines в своем приложении для Android, и я пытаюсь выполнить следующий модульный тест

@Test fun `When getVenues success calls explore venues net controller and forwards result to listener`() = runBlocking { val near = "Barcelona" val result = buildMockVenues() val producerJob = produce<List<VenueModel>>(coroutineContext) { result.value } whenever(venuesRepository.getVenues(eq(near))) doReturn producerJob // produce corooutine called inside interactor.getVenues(..) interactor.getVenues(near, success, error) // call to real method verify(venuesRepository).getVenues(eq(near)) verify(success).invoke(argThat { value == result.value }) } 

Метод взаимодействия заключается в следующем

 fun getVenues(near: String, success: Callback<GetVenuesResult>, error: Callback<GetVenuesResult>) = postExecute { repository.getVenues(near).consumeEach { venues -> if (venues.isEmpty()) { error(GetVenuesResult(venues, Throwable("No venues where found"))) } else { success(GetVenuesResult(venues)) } } } 

postExecute{..} – это метод на BaseInteractor который выполняет функцию в потоке ui через пользовательский Executor, который использует сопрограмму launch(UI) из библиотеки kotlin android coroutines

 fun <T> postExecute(uiFun: suspend () -> T) = executor.ui(uiFun) 

Тогда функция repository.getVenues(..) также является сопрограммой, которая возвращает ProducerJob с использованием produce(CommonPool) {}

Проблема заключается в том, что он сглаживает, что обратный вызов успеха в функции-взаимодействии, похоже, не выполняется в соответствии с

 verify(success).invoke(argThat { value == result.value }) 

Тем не менее, я вижу во время отладки, что выполнение в функции-взаимодействии достигает if (venues.isEmpty()) внутри consumeEach но затем оттуда выходит и продолжается с тестом, очевидно, что не consumeEach проверить обратный вызов успеха.

Я немного новичок в сопрограммах, поэтому любая помощь будет оценена.

Я понял это. Я видел, что проблема заключалась именно в этом производстве coroutine, а не в других тестах, которые также используют сопрограммы и работают отлично. Я заметил, что на самом деле я пропустил отправку на насмешливое ProducingJob, чтобы он действительно произвел значение, в данном случае список макетов. Я просто добавил, что изменение макета производящей работы на

 val producerJob = produce { send(result.value) }