Mockk 如何验证接受构造函数 lambda 的方法是否被调用

问题描述 投票:0回答:1

嘿,我在接受具有以下签名的 lambda 构造函数类型的方法时遇到问题:

    class EventLog() {
       inline fun log(block: Builder.() -> Unit) = Builder(logger.atInfo()).apply(block).build().log()
    }

我的单元测试包括以下片段:

 mockkStatic(::eventLogger)
 every { eventLogger.log (
            any<com.tlx.bundling.common.logging.Logger.Builder.()-> Unit>()
        )} returns Unit

我的最终目标是验证 eventLogger.log() { 任何 } 至少被调用 1 次。

这段代码抛出异常:

接收器类 kotlin.jvm.functions.Function1$Subclass1 没有 定义或继承已解析方法“抽象”的实现 接口的 java.lang.Object invoke(java.lang.Object)' kotlin.jvm.functions.Function1。 java.lang.AbstractMethodError: 接收器类 kotlin.jvm.functions.Function1$Subclass1 没有 定义或继承已解析方法“抽象”的实现 接口的 java.lang.Object invoke(java.lang.Object)' kotlin.jvm.functions.Function1。 在 com.tlx.bundling.subscriber.adapters.iqiyi.IQIYIubscriberManagerTest$1$2.invokeSuspend$lambda$0(IQIYIubscriberManagerTest.kt:170) 在 io.mockk.impl.eval.RecordedBlockEvaluator$record$block$1.invoke(RecordedBlockEvaluator.kt:24) 在 io.mockk.impl.eval.RecordedBlockEvaluator$enhanceWithRethrow$1.invoke(RecordedBlockEvaluator.kt:76)

kotlin unit-testing mocking mockk mockk-verify
1个回答
0
投票

内联函数是inlined。这意味着当您写

eventLogger.log { ... }
时,实际上并没有呼叫。相反,编译器会将该调用替换为
log
的主体 - 即
Builder(logger.atInfo()).apply { ... }.build().log()

因此,要检查对

log
的呼叫,您实际上需要检查
Builder(logger.atInfo()).apply { ... }.build().log()
中的每个呼叫。而且您无法区分对
log
的调用和在代码中字面书写
Builder(logger.atInfo()).apply { ... }.build().log()
的人。

或者,您可以删除

inline

© www.soinside.com 2019 - 2024. All rights reserved.