我有以下代码:
suspend fun initialize(sdk: Sdk) =
suspendCoroutine<Unit> { continuation ->
try {
sdk.initialize(
callback = { continuation.resume(Unit) },
onFailure = { error -> continuation.resumeWithException(SdkException(error.message)) })
} catch (exception: Exception) {
continuation.resumeWithException(
SdkException("Crash inside SDK", exception)
)
}
}Sdk是一个第三方库。我正在使用suspendCoroutine暂停协程,并在sdk完成初始化后恢复。一切都很好,但是当我尝试编写这样的单元测试时,我得到了以下IllegalStateException: This job has not completed yet。我正在使用mockito-kotlin编写以下测试:
@Test
fun `should initialize sdk correctly`() = runBlockingTest {
val sdk = mock<Sdk>()
initializeSdk(sdk)
verify(sdk).initialize(any(), any())
}基本上,我想要做的是能够测试resume和resumeWithException
发布于 2021-08-23 13:40:58
就我个人而言,我不是mock的粉丝。如果Sdk是一个接口,您只需提供您自己的测试实现来执行您的测试(以获得成功和错误结果)。您可以精确地控制何时/是否调用回调等。
如果Sdk是一个你不能控制的类,你可以创建一个接口来抽象Sdk类,让你的initialize方法使用你自己的接口。然而,我必须承认这并不理想。
如果您坚持使用mocking,通常mocking库可以让您使用调用参数来模拟对方法调用的响应。对于Mockito,应该是这样的:
val sdk = mock<Sdk> {
on { initialize(any(), any()) } doAnswer { invocation ->
@Suppress("UNCHECKED_CAST")
val successCallback = invocation.arguments[0] as (() -> Unit) // use callback's function type here
successCallback.invoke()
}
}(尽管我不是Mockito方面的专家,因此可能有更简洁或类型安全的方法:D)
https://stackoverflow.com/questions/68893372
复制相似问题