假设我们要测试以下函数

fun loadData(dataId: Long, completion: (JsonElement?, Exception?) -> Unit) {
    underlayingApi.post(url = "some/rest/url",
            completion = { rawResult, exception ->
                val processedResult = processJson(rawResult)
                completion(processedResult, exception)
            })
}

我很清楚如何模拟、注入、存根和验证对underlayingApi的调用.

How to verify the result returned via completion(processedResult, exception)?

推荐答案

为了测试lambdas行为,必须模拟underlayingApi,其中lambda是通过InvoactionOnMock对象调用的,如下所示.

    `when`(underlayingApi.post(eq("some/rest/url"),
                               any())).thenAnswer {
        val argument = it.arguments[1]
        val completion = argument as ((rawResult: String?, exception: Exception?) -> Unit)
        completion.invoke("result", null)
    }

This leads to the invocation of the callback within the object under test. Now to check if the callback out of the object under test is working verify it like that.

    objUnderTest.loadData(id,
                          { json, exception ->
                              assert....
                          })

Kotlin相关问答推荐

这些Kotlin函数等效吗?

Android前台服务 list —Altbeacon

Kotlin-删除按钮周围的空格

外键是主键的一部分,但不是索引的一部分.房间

为什么Kotlin函数参数名会 destruct 方法调用?

Android Studio中的只读集合不支持操作失败的原因是什么?

为什么不';Kotlin是否在数据类构造函数中隐式分配null值可为null的字段?

如何使用 Kotlin Maven 更改 Minecraft 插件中的 Shulker GUI 标题

找不到有效的 Docker 环境

顶级属性的初始化

如何在 jOOQ 中两次加入同一张表?

JobIntentService 被销毁,当应用程序被销毁时

Kotlin 解构超过五个组件

Kotlin-Java 互操作不能与可变参数一起使用

如何修复 ViewPager2 中的Design assumption violated错误?

在 Scaffold Jetpack Compose 内的特定屏幕上隐藏顶部和底部导航器

requireNotNull vs sure !! 操作符

如何捕获传递给模拟函数的参数并返回它?

使用主构造函数时使用Kotlin getter/setter

@StringRes、@DrawableRes、@LayoutRes等android注释使用kotlin参数进行判断