Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第 20 章:单元测试与调试

第 20 章:单元测试与调试

20.1 JUnit 5 与 Mockito

1. JUnit 5 简介

JUnit 5 是 Java 生态中最流行的单元测试框架之一,Kotlin 可以无缝集成 JUnit 5 进行单元测试。
核心组件:

  • JUnit Jupiter:提供测试注解和断言 API。
  • JUnit Platform:测试引擎的运行基础。
  • JUnit Vintage:兼容旧版 JUnit 4 测试。

依赖配置(Gradle):

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
    testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")
}

2. 编写 Kotlin 单元测试

基本测试示例:

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

class CalculatorTest {
    @Test
    fun `test addition`() {
        val calculator = Calculator()
        assertEquals(4, calculator.add(2, 2))
    }
}

常用注解:

  • @Test:标记测试方法。
  • @BeforeEach / @AfterEach:每个测试前后的操作。
  • @DisplayName:自定义测试显示名称。

3. Mockito 模拟依赖

Mockito 用于模拟外部依赖(如数据库、网络请求),隔离测试目标代码。

依赖配置(Gradle):

testImplementation("org.mockito:mockito-core:4.5.1")
testImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0") // Kotlin 扩展

使用示例:

import org.junit.jupiter.api.Test
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever

class UserServiceTest {
    private val userRepository = mock<UserRepository>()
    private val userService = UserService(userRepository)

    @Test
    fun `getUserById should return user`() {
        val expectedUser = User(id = 1, name = "Alice")
        whenever(userRepository.findById(1)).thenReturn(expectedUser)

        val result = userService.getUserById(1)
        assertEquals(expectedUser, result)
        verify(userRepository).findById(1) // 验证调用
    }
}

4. Kotlin 与 Mockito 的注意事项

  • 避免 when 关键字冲突:使用 Mockito-Kotlin 的 whenever。
  • 模拟 final 类:Kotlin 默认类为 final,需在 build.gradle 中启用 Mockito 扩展:
    testImplementation("org.mockito:mockito-inline:4.5.1")
    

5. 进阶技巧

  • 参数化测试:使用 @ParameterizedTest 和 @ValueSource。
  • 断言增强:结合 Kotlin 的 assertAll 进行多条件验证。
  • Mockito 验证:verify 方法检查模拟对象的交互行为。

最佳实践:

  • 优先测试业务逻辑而非实现细节。
  • 使用 given-when-then 结构组织测试代码。
  • 为测试类和方法命名时采用描述性语言(如反引号语法)。
Last Updated:: 5/21/25, 7:58 PM