使用Mockito对SharedPreferences包装器进行单元测试

时间:2018-02-06 22:10:59

标签: java android junit mockito sharedpreferences

我在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答案,但如果可能的话,我强烈希望避免使用那些简单的测试。如果我确实需要使用其他工具,我应该看一下该工具如何解决这个问题?

1 个答案:

答案 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);
}

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