【问题标题】:mockk verify lambda argumentmockk 验证 lambda 参数
【发布时间】:2018-12-24 09:30:59
【问题描述】:

我想验证通过 lamdba 传入的值。 函数如下所示:

fun save(entity: Any, idSupplier: () -> UUID): JsonEntity {
    return save(JsonEntity(idSupplier(), entity, entity::class.simpleName!!))
}

现在在我的测试中,我想验证为 idSupplier 传入的值。我做了一个模拟来返回 save(...) 的值,它在我自己的 save(..., () -> ...) 中调用,就像这样

every { jsonStorage.save(any<JsonEntity>()) } answers { value }

现在验证我现在有这个

verify(exactly = 1) { jsonStorage.save(event, any()) }

哪个有效,但我想知道传递的确切值,即如果实体的 id 是 123,我想验证这一点。

提前谢谢你

【问题讨论】:

    标签: kotlin mockk


    【解决方案1】:

    您需要一个用于capturing the parameters 的插槽。

    示例

    val id = slot<UUID>()
    every { save(any<JsonEntity>()) { capture(id)} } answers { value }
    
    // `id.captured` contains the value passed 
    // as a parameter in the lambda expression `idSupplier`
    
    assertEquals(UUID.fromString("4195f789-2730-4f99-8b10-e5b9562210c1"), id.captured)
    

    【讨论】:

    • 感谢这个答案,这有助于我前进。验证部分呢?是否保持不变,或者我可以在验证中更具体吗?
    • @TomdeVroomen,当然,你可以使用id.captured来验证它的值
    • @TomdeVroomen 我更新了我的答案以展示如何使用Slot
    • 感谢您的解决方案,它让我走上了正轨。但是,该示例不太符合我的情况,因为我想捕获 lambda 本身。在 Medium 上有一个 great article 正是这样做的:val captureCallback = slot&lt;() -&gt; UUID&gt;(); every { save(capture(captureCallback)) } answers { ... }
    • @J.Buehler 我以前从未使用过这个函数,但在我看来,为了捕获 lambda,你可以使用 captureLambda() function mockk.io
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多