首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用回调对挂起函数进行单元测试

如何使用回调对挂起函数进行单元测试
EN

Stack Overflow用户
提问于 2021-08-23 13:13:20
回答 1查看 207关注 0票数 1

我有以下代码:

代码语言:javascript
复制
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编写以下测试:

代码语言:javascript
复制
    @Test
    fun `should initialize sdk correctly`() = runBlockingTest {
        val sdk = mock<Sdk>()

        initializeSdk(sdk)

        verify(sdk).initialize(any(), any())
    }

基本上,我想要做的是能够测试resumeresumeWithException

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-23 13:40:58

就我个人而言,我不是mock的粉丝。如果Sdk是一个接口,您只需提供您自己的测试实现来执行您的测试(以获得成功和错误结果)。您可以精确地控制何时/是否调用回调等。

如果Sdk是一个你不能控制的类,你可以创建一个接口来抽象Sdk类,让你的initialize方法使用你自己的接口。然而,我必须承认这并不理想。

如果您坚持使用mocking,通常mocking库可以让您使用调用参数来模拟对方法调用的响应。对于Mockito,应该是这样的:

代码语言:javascript
复制
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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68893372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档