Mockk验证接收构造器类型Lambda的方法调用时遇AbstractMethodError问题
问题原因
EventLog.log()是inline函数,Kotlin的inline函数在编译时会将函数体(包括传入的Lambda)直接内联到调用处,而Mockk的mockkStatic基于字节码代理实现,无法正确处理内联函数的特殊编译逻辑,进而导致Lambda相关方法实现缺失,抛出AbstractMethodError。
解决方法
重构代码,避免mock inline函数
将inline函数的核心逻辑抽离到非inline方法中,比如:// 原EventLog类改造 class EventLog { inline fun log(block: Builder.() -> Unit) { val builder = Builder() block(builder) internalLog(builder.build()) } // 新增非inline方法承载实际日志逻辑 fun internalLog(event: Event) { // 实际日志处理逻辑 } }测试时只mock非inline的
internalLog():val mockEventLog = mockk<EventLog>() every { mockEventLog.internalLog(any()) } just Runs // 执行被测试代码后验证 verify { mockEventLog.internalLog(any()) }尝试Mockk的inline配置(有限支持)
若无法重构,可在mockkStatic时添加inline配置,但仅适配简单场景:mockkStatic(::eventLogger, inlineOptions = InlineOptions.ALLOW) every { eventLogger.log(any()) } just Runs // 执行测试后验证 verify { eventLogger.log(any()) }用真实对象配合测试桩
若日志逻辑无副作用,可直接使用真实实例,捕获输出结果验证:val capturedEvents = mutableListOf<Event>() val testEventLog = object : EventLog() { override fun internalLog(event: Event) { capturedEvents.add(event) } } // 注入testEventLog到被测试代码,执行后检查结果 assert(capturedEvents.isNotEmpty())
内容的提问来源于stack exchange,提问作者Alexander Petrov
相关产品推荐
相关产品推荐

