测试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
相关产品推荐
相关产品推荐

