使用Mockito来测试共享流程包装器



我在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);
}

解决方案:检查模拟对象上的每个使用的方法是否也正确模拟!

相关内容

  • 没有找到相关文章

最新更新