【问题标题】:How to run lambda function passed to a mockked method?如何运行传递给模拟方法的 lambda 函数?
【发布时间】:2020-07-21 08:14:33
【问题描述】:

我想知道有什么方法可以运行作为参数传递给模拟函数的 lambda 函数。并在调用模拟方法时运行它。

我正在使用 Mockk,我想代码是这样的:

class DataManager {
   fun submit(lambda: (Int) => Unit) { ... }
}

...

val mock = mockk<DataManager>()

every { mock.submit(lambda = any()) }.run { lambda(5) }

在我的实际实现中,datamanager 调用服务器并在收到成功响应时将 lambda 作为回调运行。 lambda 恰好是被测类的私有方法。

【问题讨论】:

    标签: android unit-testing kotlin functional-programming mockk


    【解决方案1】:

    您需要使用 Capture 而不是 Any。

    val dataManager: DataManager = mockk()
    
    every { dataManager.submit(captureLambda()) } answers { lambda<(Int) -> Unit>().invoke(5) }
    
    dataManager.submit { i -> println(i) }
    

    另外你的函数类型的声明是无效的。

    你有(Int) =&gt; Unit,而它应该是(Int) -&gt; Unit

    【讨论】:

    • 感谢您的出色回答,对我帮助很大。但是有一个小错误。它实际上应该是every { mock.submit(lambda = capture(slot) ) } 。您的答案中缺少capture。如果你能更新它会很棒:)
    • 很高兴为您提供帮助。我昨晚在猜测语法,今天下午决定仔细检查。我发现 mockk 有针对这种情况的特定匹配器和答案范围扩展。我已经相应地更新了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多