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

测试Firebase协程创建用户调用await()提示This job has not completed yet如何解决

问题根因

你遇到的java.lang.IllegalStateException: This job has not completed yet异常,核心原因是**runBlockingTest(协程测试旧API)使用虚拟时间调度,无法识别Firebase Task异步任务跑在真实物理线程上的逻辑**,测试会在Firebase返回结果前就强制结束,触发未完成job的报错。另外InstantTaskExecutorRule仅用于处理Jetpack Arch组件(如LiveData、Room)的主线程切换,对Firebase SDK的内部线程池无任何效果。

正确实现方案
  • 如果你使用旧版本kotlinx-coroutines-test(1.6.0以下):直接用runBlocking替代runBlockingTest即可,这类对接Firebase模拟器的属于集成测试,不需要协程测试库的虚拟时间能力。
  • 如果你使用1.6.0及以上版本的协程测试库:用官方推荐的runTest替代已废弃的runBlockingTest。
  • 可选增加超时逻辑,避免模拟器异常导致测试无限等待。
修正后的完整代码
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.tasks.await
import kotlinx.coroutines.withTimeout
import org.junit.Rule
import org.junit.Test

class FirebaseCoroutineTest {
    @get:Rule
    val instantTaskExecutorRule = InstantTaskExecutorRule()

    private val auth = Firebase.auth.apply {
        useEmulator("10.0.2.2", 9099)
    }


    @Test
    fun testCreateUser() = runBlocking {
        // 10秒超时,可自行调整
        withTimeout(10000) {
            auth.createUserWithEmailAndPassword("test@user.null", "testpwd").await()
        }
    }
}
额外注意事项
  • 测试启动前需确保Firebase Auth模拟器已正常启动,端口和代码中配置的9099一致
  • 如果运行测试的是真机而非模拟器,需将10.0.2.2替换为电脑的局域网IP
  • 多次运行同个测试会报用户已存在的错误,可以在测试结束后调用auth.currentUser?.delete()清理测试数据,或者每次测试生成随机邮箱

内容的提问来源于stack exchange,提问作者Manuel Siebeneicher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:27:02