StoriesViewModel单元测试报错:TestCoroutineExceptionHandler已废弃无替代方案
解决TestCoroutineExceptionHandler废弃问题
错误信息
Using 'TestCoroutineExceptionHandler' is an error. Deprecated for removal without a replacement. It may be to define one's own
CoroutineExceptionHandlerif you just need to handle uncaught exceptions without a specialTestCoroutineScopeintegration.
问题定位
错误源于MainDispatcherRule类中依赖了已废弃的TestCoroutineExceptionHandler来构建测试协程作用域。
解决方案
按照官方提示,通过自定义CoroutineExceptionHandler替代废弃类,调整MainDispatcherRule的实现即可解决:
1. 自定义测试用异常处理器
创建一个简单的异常处理器,在测试中直接抛出未捕获的协程异常,方便定位问题:
val testCoroutineExceptionHandler = CoroutineExceptionHandler { _, throwable -> throw throwable }
2. 修改MainDispatcherRule实现
移除对TestCoroutineExceptionHandler的依赖,改用自定义处理器构建测试作用域:
@OptIn(ExperimentalCoroutinesApi::class) class MainDispatcherRule( private val dispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher() ) : TestWatcher(), TestCoroutineScope by createTestCoroutineScope( dispatcher + testCoroutineExceptionHandler ) { override fun starting(description: Description?) { super.starting(description) Dispatchers.setMain(dispatcher) } override fun finished(description: Description?) { super.finished(description) cleanupTestCoroutines() Dispatchers.resetMain() } }
3. 测试逻辑兼容验证
修改完成后,原StoriesViewModelTest无需任何调整,runBlockingTest可正常使用,未捕获的协程异常会被自定义处理器抛出,确保测试失败时能直接看到错误详情。
可选简化方案
如果测试场景不需要专门处理异常,也可直接移除异常处理器,仅使用TestCoroutineDispatcher构建作用域:
createTestCoroutineScope(dispatcher)
内容的提问来源于stack exchange,提问作者Zainal Abidin
相关产品推荐
相关产品推荐

