我们最近开始在我们的 Android 应用程序上使用协程。一切都很好,花花公子,直到有人写了大致相当于以下函数的东西:
fun example(dispatcher: CoroutineDispatcher, block: () -> Unit) {
launch(dispatcher) {
block()
}
}
我们想编写一个测试来验证block
使用dispatcher
.
我们尝试了以下方法,但这不起作用,因为我们得到一个 NullPointerException 因为dispatcher.parentContext
没有被模拟。我讨厌嘲笑它,因为我们不在乎它在什么上下文中执行,只关心它被执行了:
@Test
fun `test that doesn't work`() {
val dispatcher: CoroutineDispatcher = mock()
val block: () -> Unit = mock()
// fails here, specifically on the call to `launch` in example()
example(dispatcher, block)
val captor = argumentCaptor<Runnable>()
verify(dispatcher).dispatch(any(), captor.capture())
verify(block, never()).invoke()
captor.firstArgument.run()
verify(block).invoke()
}
我们已经把它作为一种选择,但它仍然感觉不对:
@Test
fun `test that works but doesn't feel right`() {
val executor: ExecutorService = mock()
val block: () -> Unit = mock()
example(executor.asCoroutineDispatcher(), block)
val captor = argumentCaptor<Runnable>()
verify(executor).execute(captor.capture())
verify(block, never()).invoke()
captor.firstArgument.run()
verify(block).invoke()
}
有人能想出更好的吗?
编辑:
显着的依赖关系如下:
com.nhaarman:mockito-kotlin:1.5.0
org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5
junit:junit:4.12
org.jetbrains.kotlin:kotlin-stdlib:1.2.30