我正在Android应用程序中测试Kotlin协程,并尝试执行以下单元测试
@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上的一个方法,它通过使用kotlin android协程库中的launch(UI)协程的自定义执行器来执行UI线程中的函数
fun <T> postExecute(uiFun: suspend () -> T) =
executor.ui(uiFun)然后,repository.getVenues(..)函数也是一个使用produce(CommonPool) {}返回ProducerJob的协程
问题是,它认为交互器函数中成功回调似乎不是按照
verify(success).invoke(argThat {
value == result.value
})但是,在调试时,我确实看到交互器函数中的执行到达了consumeEach中的if (venues.isEmpty())行,但是从那里退出并继续测试,显然在验证成功回调时失败。
我是一个新的协程,所以任何帮助都将不胜感激。
发布于 2017-12-02 23:13:18
我弄明白了这一点。我发现问题出在这个生产协程上,而不是其他也在使用协程并且工作正常的测试上。我注意到,我实际上错过了模拟ProducingJob上的发送,以便让它实际生成一个值,在本例中是模拟列表。我刚刚添加了将制作作业的模拟更改为
val producerJob = produce { send(result.value) }https://stackoverflow.com/questions/47603429
复制相似问题