Gradle Kotlin项目怎么测试协程代码

小枫君_4291

小枫君_4291

2026-10-25

949人浏览

原创

应使用 runtest 而非 runblockingtest(已弃用)或 runblocking:前者自动虚拟时间、捕获异常、等待全部协程完成;后者不替换调度器、真实等待 delay、静默吞异常且无父子协程清理机制。

gradle kotlin项目怎么测试协程代码

直接用 runTest,别碰 runBlockingTest(已弃用)或裸写 runBlocking。 否则测试会漏异常、时间不虚拟、作用域不自动清理,甚至在 CI 上随机失败。

为什么不能用 runBlocking 测试协程

它只是阻塞当前线程等待协程结束,但:
• 不替换默认调度器,Dispatchers.Main 或 Dispatchers.IO 仍走真实线程池
• delay(1000) 会真等 1 秒,拖慢整个测试套件
• 未捕获的协程异常会被静默吞掉,测试通过但逻辑实际已崩
• 没有父子协程自动等待机制,子协程可能被提前裁剪

runTest 必须配的依赖和配置

确保 build.gradle.kts 中有:

dependencies {
    testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0")
    testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
}

不需要手动设置 TestCoroutineDispatcher 或调用 Dispatchers.setMain() —— runTest 内部已自动完成这些。

常见错误写法及修正

以下写法看似能跑通,但埋了坑:

  • 错:用 GlobalScope.launch + join() —— 测试作用域外启动协程,join() 只等一个,其他子协程不受控
  • 错:在 @Test 函数里直接调 suspend 函数 —— 编译报错 “Suspend function should be called only from a coroutine”
  • 错:用 runBlocking { launch { ... } } —— 子协程没 await,测试函数返回时它还在后台跑
  • 对:统一用 runTest { ... },所有挂起调用、async、launch 都在它的作用域内,自动等待全部完成

示例:

@Test
fun networkCall_returnsResult() = runTest {
    val repo = TitleRepository(FakeNetwork("OK"), FakeDao())
    val result = repo.refreshTitle() // 直接调 suspend 函数
    assertEquals("OK", result)
}

延迟和时间控制必须用虚拟时钟

如果被测代码含 delay(3000) 或 withTimeout:
• runTest 默认启用虚拟时间,delay 不会真实休眠
• 用 advanceTimeBy(3000) 手动快进,验证中间状态
• 用 advanceUntilIdle() 等待所有挂起操作自然结束
• 别依赖 Thread.sleep 或真实计时器断言,那会破坏确定性

真正容易被忽略的是:即使你写了 runTest,如果测试函数签名用了 suspend(比如 @Test suspend fun ...),JUnit 会跳过它——JVM 测试运行器根本不认识协程。必须保持函数是普通 @Test fun,靠 = runTest { ... } 尾置调用来承载协程上下文。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

2026.02.12

371

18

Java Kotlin协程与异步编程实战
Java Kotlin协程与异步编程实战

本专题围绕 Kotlin 协程与异步编程展开,讲解挂起函数、协程作用域、异步任务调度及并发控制方法。通过实际项目案例,帮助开发者提升后端服务性能,实现高效异步任务处理与稳定性保障。

2026.04.13

159

16

Kotlin Android开发教程大全
Kotlin Android开发教程大全

系统讲解 Google 官方推荐的 Android 开发首选语言 Kotlin 的核心知识与工程实践,涵盖 Kotlin 简洁语法(空安全/数据类/扩展函数/解构声明/作用域函数)与 Java 互操作、集合操作与函数式编程、协程(Coroutines)异步编程(suspend/launch/async/Flow)、Jetpack Compose 声明式 UI 开发(状态管理/组合函数/导航/动画)、MVVM / MVI 架构设计与 Vi

2026.06.03

268

19

软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

2023.10.13

4770

8

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2023.10.23

3181

10

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

2025.10.24

1126

26

Java Maven/Gradle 构建与依赖管理合集
Java Maven/Gradle 构建与依赖管理合集

系统讲解 Java 项目构建工具的使用与进阶配置,涵盖 Maven 的 POM 文件结构、生命周期(clean/compile/package/install/deploy)与插件机制、依赖范围(compile/provided/test/runtime)与传递依赖管理、多模块聚合与继承、私有 Nexus 仓库发布,以及 Gradle 的 Groovy / Kotlin DSL 语法、Task 自定义与增量构建、依赖版本目录(Versi

2026.05.09

369

25

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

20

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

20

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Gradle 9 主版本升级指南
Gradle 9 主版本升级指南

共0课时 | 0人学习

Gradle 安全最佳实践
Gradle 安全最佳实践

共0课时 | 0人学习

Gradle 依赖校验手册
Gradle 依赖校验手册

共0课时 | 0人学习