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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:15:02