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

JUnit测试SharedPreferences报Wanted but not invoked错误如何解决?

问题根因
  • 执行顺序错误:你在测试方法中先执行了verify校验mock对象的调用情况,之后才调用userRepo.storeUser(user)触发业务逻辑,校验时editor还未被任何代码调用,因此抛出零交互的错误。
  • 链式调用适配缺失:putString方法会返回Editor实例以支持链式调用,你没有对该返回值做mock配置,即使调整顺序后也可能出现空指针或调用不匹配的问题。
解决方案

直接修改测试方法的执行顺序,补充putString的mock返回配置即可,修正后的测试代码如下:

@Test
fun `when store user then load user`() {
    // mock配置
    whenever(context.getSharedPreferences(USER_PREFS, Context.MODE_PRIVATE)).thenReturn(userPrefs)
    whenever(userPrefs.edit()).thenReturn(editor)
    // 适配链式调用:putString返回editor本身
    whenever(editor.putString(anyString(), anyString())).thenReturn(editor)
    
    val user = getUser()
    // 先执行业务方法
    userRepo.storeUser(user)
    // 后校验调用情况
    verify(editor, times(1)).putString(USER_ID_KEY, user!!.userID)
    verify(editor, times(1)).apply()
}

修改说明

  1. 调整了业务方法执行和mock校验的顺序,先触发逻辑再验证调用符合预期
  2. 补充了editor.putString的返回值配置,保证链式调用的链路符合SharedPreferences的实际调用逻辑
  3. 拆分了putString和apply的校验,避免Mockito对链式调用的校验匹配异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:36:08