嘿,我在接受具有以下签名的 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)
内联函数是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
。