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

如何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 20:15:06