使用Mockito在Android单元测试中模拟共享首选项时出错

Ash*_*win 2 android mockito sharedpreferences

我试图通过使用Mockito Library模拟Android共享偏好来编写单元测试,但是即使经过多次尝试它也不适用于我.请检查下面的示例代码,让我知道它出了什么问题

我目前正在使用"JCAndKSolutions/android-unit-test"android junit插件.

我的代码如下:

PreferenceHelper.java public class PreferencesHelper {private SharedPreferences mSharedPreferences;

 public class PreferencesHelper
    {
         private SharedPreferences mSharedPreferences;

         static String PREFERENCE_USER;

         public PreferencesHelper(SharedPreferences mSharedPreferences)
        {
            this.mSharedPreferences = mSharedPreferences;
        }

        public void setUserName(String userName)
        {
            mSharedPreferences.edit().putString(PREFERENCE_USER,   "Vkc").apply();
        }

        public String getUserName()
        {
            return mSharedPreferences.getString(PREFERENCE_USER, null);

        }

    }


Run Code Online (Sandbox Code Playgroud)

PreferenceHelperTest.java

public class PreferencesHelperTest extends TestCase
{
    @Mock
    SharedPreferences mSharedPreference;

    @Mock
    SharedPreferences.Editor mEditor;

    @Mock
    Context context;

    @Mock
    PreferenceManager mPreferenceManager;

    PreferencesHelper mPrefHelper;

    public void setUp() throws Exception
    {
        initMocks(this);
    }

    public void testSetUserName(){

        final InOrder inOrder = inOrder(mEditor);
        when(mSharedPreference.edit()).thenReturn(mEditor);
        mPrefHelper = new PreferencesHelper(mSharedPreference);

        mPrefHelper.setUserName("Grapes");
        inOrder.verify(mEditor).putString(PreferencesHelper.PREFERENCE_USER, "Grapes");
        inOrder.verify(mEditor).apply();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我运行此junit测试,我会收到以下错误

java.lang.NullPointerException
    at     com.example.aag.testhelloworld.PreferencesHelper.setUserName(PreferencesHelper.java:21)
    at     com.example.aag.testhelloworld.PreferencesHelperTest.testSetUserName(PreferencesHelperTest.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at     org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
at     com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Run Code Online (Sandbox Code Playgroud)

在调试时我发现在调用putString()方法时抛出了nullPointer异常.

它出错的任何帮助或线索?

Mat*_*ler 7

我相信问题是因为你在嘲笑它Editor,当你调用putString()它时会返回一个不同的对象.尝试模拟该putString()方法,如下所示: when(mEditor.putString(anyString(), anyString())).thenReturn(mEditor);