我在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();
我缺少做这项模拟工作的东西?我已经看到了许多其他的答案建议使用各种工具,但是如果可能的话,我强烈希望避免使用这些工具进行简单的测试。如果我确实需要使用其他工具,我应该看什么,该工具如何解决该问题?
问题简单地缺少模拟。我忘了共享创建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);
}
解决方案:检查模拟对象上的每个使用的方法是否也正确模拟!