You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Mockito验证特定Lambda方法被作为参数传入

验证Kotlin高阶函数参数的交互逻辑

针对你这个测试场景——验证testedMethod调用anotherMethod时传入的Lambda确实会触发passedMethod,用Kotlin生态里的MockK框架是最简洁的方案,它对高阶函数的支持非常原生,比Mockito更适配Kotlin语法。

下面是完整的测试实现:

测试思路

我们需要两步核心验证:

  • 确认testedMethod确实调用了anotherMethod;
  • 确保传入anotherMethod的Lambda在执行时,会正确调用passedMethod。

MockK实现代码

首先确保你的项目引入了MockK依赖(比如Gradle中添加testImplementation "io.mockk:mockk:1.13.8"),然后编写测试类:

import io.mockk.mockk
import io.mockk.verify
import io.mockk.lambdaCaptured
import io.mockk.captureLambda
import org.junit.Test

class TestedClassTest {

    @Test
    fun `testedMethod should pass lambda that invokes passedMethod to anotherMethod`() {
        // 创建TestedClass的Spy实例,允许跟踪内部方法调用
        val testedClass = mockk<TestedClass>(relaxed = true)

        // 执行待测试方法
        testedClass.testedMethod()

        // 捕获传入anotherMethod的Lambda参数
        verify {
            testedClass.anotherMethod(captureLambda())
        }

        // 执行捕获到的Lambda,验证它确实会调用passedMethod
        val capturedLambda = lambdaCaptured<() -> Unit>()
        capturedLambda.invoke()
        verify(exactly = 1) { testedClass.passedMethod() }
    }
}

代码解释

  • mockk<TestedClass>(relaxed = true):创建一个"宽松"的Spy对象,未显式Stub的方法会自动返回默认值,避免测试中出现不必要的报错;
  • captureLambda():MockK提供的专门用于捕获高阶函数参数的工具,能轻松拿到传入anotherMethod的Lambda;
  • 执行捕获的Lambda后,用verify(exactly = 1)确认passedMethod被精准调用了一次,确保Lambda的逻辑完全符合预期。

备选方案:Mockito实现

如果你更熟悉Mockito,也可以用它来实现,不过代码会稍微繁琐一点:

import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.Mockito.*

class TestedClassTest {

    @Test
    fun `verify lambda passed to anotherMethod invokes passedMethod`() {
        val testedClass = spy(TestedClass())

        testedClass.testedMethod()

        // 声明Lambda类型的参数捕获器
        val lambdaCaptor = ArgumentCaptor.forClass((() -> Unit)::class.java)
        verify(testedClass).anotherMethod(lambdaCaptor.capture())

        // 执行捕获的Lambda并验证passedMethod调用
        lambdaCaptor.value.invoke()
        verify(testedClass, times(1)).passedMethod()
    }
}

总结

MockK的方案更贴合Kotlin的语法特性,代码更简洁易读,是这类高阶函数交互测试的首选。

内容的提问来源于stack exchange,提问作者Sebastian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:57:13