我在Android中的SharedPreferences
附近有一个实用程序包装器。我想对这个包装器进行单元测试,所以我在嘲笑我没有测试的部分:
@Before
public void setup() {
context = Mockito.mock(Context.class);
prefs = Mockito.mock(SharedPreferences.class);
editor = Mockito.mock(SharedPreferences.Editor.class);
when(context.getSharedPreferences(anyString(), anyInt())).thenReturn(prefs);
when(prefs.edit()).thenReturn(editor);
when(editor.commit()).thenReturn(true);
}
然而,我的测试在我获得Editor
的行中击中了NPE:
SharedPreferences.Editor editor = prefs.edit();
我缺少什么让这个模拟工作?我已经看到了许多推荐使用各种工具的其他SO答案,但如果可能的话,我强烈希望避免使用那些简单的测试。如果我确实需要使用其他工具,我应该看一下该工具如何解决这个问题?
答案 0 :(得分:1)
问题原来只是缺少嘲笑。我忘了分享创建prefs
的行,该行依赖context.getString()
。错误将我指向上面显示的线,但事实证明上面的线具有实际的NPE。 .getString()
返回测试字符串的简单模拟工作:
@Before
public void setup() {
context = Mockito.mock(Context.class);
prefs = Mockito.mock(SharedPreferences.class);
editor = Mockito.mock(SharedPreferences.Editor.class);
when(content.getString(anyInt())).thenReturn("test-string");
when(context.getSharedPreferences(anyString(), anyInt())).thenReturn(prefs);
when(prefs.edit()).thenReturn(editor);
when(editor.commit()).thenReturn(true);
}
解决方案:检查模拟对象上的每个使用方法是否也被正确模拟了!