Kotlin协同工具使用生产和mockito来嘲笑生产工作

我在我的Android应用程序中测试Kotlin协同程序,我正在尝试执行以下unit testing

@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>(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, error: Callback) = postExecute { repository.getVenues(near).consumeEach { venues -> if (venues.isEmpty()) { error(GetVenuesResult(venues, Throwable("No venues where found"))) } else { success(GetVenuesResult(venues)) } } } 

postExecute{..}BaseInteractor上的一个方法,它通过自定义的执行程序在ui线程中执行函数,该自定义执行程序使用kotlin android协程库中的launch(UI)协程

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

然后, repository.getVenues(..)函数也是一个协程,它使用produce(CommonPool) {}返回ProducerJob。

问题是它接缝交互函数中的成功回调似乎并没有被执行

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

不过,在调试时,我确实看到了交互函数中的执行达到了consumeEachif (venues.isEmpty())行, consumeEach那里退出并继续执行测试,显然无法validation成功回调。

我在协程上有点新,所以任何帮助,将不胜感激。

我想出了这一个。 我看到问题出在这个生成协程,而不是其他的测试,也使用协程,并且工作得很好。 我注意到我实际上错过了模拟的ProducingJob上的发送,以便实际上产生一个值,在这个例子中是模拟列表。 我只是补充说,改变生产工作的模拟

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