如何mock永远不返回结果的suspend函数,效果类似Single.never()
实现永久挂起的suspend函数(对齐
Single.never()行为) 这个需求完全可以实现,核心逻辑是让suspend函数进入无回调的永久挂起状态,既不返回结果也不抛出异常,和RxJava中Single.never()的行为完全对齐。
基础实现方案
直接基于协程标准库API即可实现通用的never()工具函数:
import kotlinx.coroutines.suspendCancellableCoroutine suspend fun <T> never(): T = suspendCancellableCoroutine { _ -> // 不调用resume/resumeWithException,协程将永久保持挂起状态 }
实际使用示例
手动Mock接口场景
假设你需要Mock以下suspend接口:
interface DataApi { suspend fun loadConfig(): AppConfig }
直接替换实现为never()即可:
val mockApi = object : DataApi { override suspend fun loadConfig(): AppConfig = never() }
配合Mockk框架使用
如果你用Mockk做协程Mock,可以直接在Stub规则里调用:
val mockApi = mockk<DataApi>() coEvery { mockApi.loadConfig() } answers { never() }
注意事项
- 该实现符合协程结构化并发规范:如果外层协程触发取消,永久挂起的函数会自动抛出
CancellationException终止挂起,不会造成内存泄漏 - 如果需要模拟完全不响应取消的极端场景,可以把
suspendCancellableCoroutine替换为suspendCoroutine,但不推荐在普通测试场景使用,可能导致测试进程无法正常退出
内容的提问来源于stack exchange,提问作者midnight
相关产品推荐
相关产品推荐

