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() }
修改说明
- 调整了业务方法执行和mock校验的顺序,先触发逻辑再验证调用符合预期
- 补充了
editor.putString的返回值配置,保证链式调用的链路符合SharedPreferences的实际调用逻辑 - 拆分了
putString和apply的校验,避免Mockito对链式调用的校验匹配异常
内容的提问来源于stack exchange,提问作者VVB
相关产品推荐
相关产品推荐

