1. 概述

本文将介绍单元测试中一个非常重要的主题:在 Kotlin 中对 Lambda 表达式进行 Mock 和验证

这在测试依赖 Lambda 行为的代码时尤为重要,掌握这些技巧可以帮助我们更有效地进行单元测试。


2. 什么是 Mock?

在 Kotlin 中,Mock 是指对代码单元所依赖的某些组件或行为进行模拟实现。我们创建的这些“假对象”(mock)不会执行真实逻辑,而是模拟真实组件的行为。

✅ 使用 Mock 可以帮助我们隔离被测代码与外部依赖,从而专注于测试当前逻辑。


3. 什么是 Lambda 表达式?

Lambda 表达式 是一段可以作为参数传递的小型函数。它非常适合用于传递自定义行为。

例如:

val add: (Int, Int) -> Int = { a, b -> a + b }

上面这段代码中,add 是一个变量,它持有一个 Lambda 表达式,该表达式接收两个 Int 参数并返回它们的和。


4. 使用 Mockito Mock 和验证 Lambda

我们将使用 Mockito 来模拟和验证 Lambda 表达式的行为。

首先,我们定义一个类用于测试:

class Calculator(private val operation: (Int, Int) -> Int) {
    fun calculate(a: Int, b: Int): Int {
        return operation(a, b)
    }
}

接着,在 build.gradle 中添加 Mockito 依赖:

dependencies {
    testImplementation("org.mockito:mockito-core:VERSION")
}

测试代码如下:

@Test
fun testLambda_WithMockito() {
    val operationMock: (Int, Int) -> Int = mock()
    val calculator = Calculator(operationMock)
    whenever(operationMock.invoke(any(), any())).thenReturn(50)
    val result = calculator.calculate(10, 5)
    assertEquals(50, result)
    verify(operationMock).invoke(eq(10), eq(5))
}

✅ 说明:

  • 使用 mock() 创建 Lambda 的 Mock 实例
  • 使用 whenever(...).thenReturn(...) 指定调用返回值
  • 使用 verify(...) 验证 Lambda 是否被正确调用

⚠️ 注意:该 Lambda 被设定为无论输入什么参数都返回 50。


5. 使用 Mockk 库

Mockk 是专为 Kotlin 设计的 Mock 框架,语法更简洁,支持 Lambda 的 Mock 和验证更自然。

先添加依赖:

dependencies {
    testImplementation("io.mockk:mockk:1.12.0")
}

测试代码如下:

@Test 
fun testLambda_UsingMockk() { 
    val operationMock = mockk<(Int, Int) -> Int>()
    every { operationMock(any(), any()) } returns 50
    val calculator = Calculator(operationMock)
    val result = calculator.calculate(10, 5) 
    assertEquals(50, result) 
    verify { operationMock(10, 5) }
}

✅ 特点:

  • 使用 mockk<>() 创建 Lambda Mock
  • 使用 every { ... } returns ... 设置返回值
  • 使用 verify { ... } 验证调用

Mockk 的语法更贴近 Kotlin 风格,推荐在 Kotlin 项目中优先使用。


6. 使用 Kotlin 原生功能

我们也可以不使用任何 Mock 框架,直接通过 Lambda 自定义行为来验证。

示例代码如下:

@Test
fun verifyLambdasCorrectly() {
    val operation: (Int, Int) -> Int = { a, b -> a - b } 
    val calculator = Calculator(operation) 
    val result = calculator.calculate(10, 5) 
    assertEquals(5, result) 
}

✅ 这种方式适用于:

  • Lambda 行为固定、简单
  • 不需要动态模拟行为的场景

⚠️ 缺点是无法验证 Lambda 是否被调用,只能验证其返回值。


7. 总结

本文介绍了三种在 Kotlin 中 Mock 和验证 Lambda 表达式的方法:

方法 工具 优点 缺点
使用 Mockito org.mockito 成熟稳定,Java 兼容性好 对 Kotlin 支持略显笨重
使用 Mockk io.mockk 语法简洁,Kotlin 友好 仅适用于 Kotlin 项目
原生 Lambda 实现 简洁、无需依赖 无法验证调用行为

✅ 推荐:优先使用 Mockk,其次是 Mockito,最后才是原生实现

如需查看完整示例代码,请访问:GitHub 示例项目


原始标题:How to Mock and Verify Lambda Expression in Kotlin