Kotlin suspend函数如何返回Result类型?单元测试报错如何修复
修复方案
核心问题原因
- 打桩返回值类型不匹配:
DataRepository.getCharacters()的返回类型是Result<ArrayList<Character>>,测试代码中打桩时直接返回了ArrayList实例,没有包装为Result类型,类型不匹配触发报错。 - 未给LiveData注册观察者:创建的
dataObserver没有绑定到charactersLiveData上,LiveData不会触发该观察者的回调,verify验证会失败。 - 代码存在笔误:打桩代码中
arrayListOf<String()缺少右尖括号,会触发编译错误。
修改后的单元测试代码
@RunWith(MockitoJUnitRunner::class) class MainActivityViewModelTest { @get:Rule val coroutineRule = MainCoroutineRule() @Mock private lateinit var dataRepository: DataRepository @Mock private lateinit var dataObserver: Observer<Result<List<Character>>> @InjectMocks private lateinit var mainActivityViewModel: MainActivityViewModel @Test fun fetchCharacters() { runBlockingTest { // 先给LiveData注册观察者 mainActivityViewModel.charactersLiveData.observeForever(dataObserver) // 构造测试数据,修正笔误 val testCharacters = arrayListOf(Character( name = "myName", img = "image", occupation = arrayListOf<String>(), status = "status", nickname = "nickName", appearance = arrayListOf<Int>() )) // 修正打桩返回值,包装为Result.success匹配返回类型 Mockito.`when`(dataRepository.getCharacters()) .thenReturn(Result.success(testCharacters)) mainActivityViewModel.fetchCharacters() verify(dataRepository).getCharacters() // 验证回调参数,ArrayList是List的子类,泛型协变可正常匹配 Mockito.verify(dataObserver).onChanged(Result.success(testCharacters)) mainActivityViewModel.charactersLiveData.removeObserver(dataObserver) } } }
补充说明
如果使用的Mockito版本对suspend函数支持不完善,可引入org.mockito.kotlin:mockito-kotlin依赖,替换Mockito.when``为whenever语法,适配suspend函数的打桩逻辑。
内容的提问来源于stack exchange,提问作者BRDroid
相关产品推荐
相关产品推荐

