共享首选项在 mockito 中为 null

Shared Preferences is null in mockito

我正在尝试使用 Mockito 模拟一个简单的共享首选项。由于 google 上的示例太复杂,无法从中提取任何内容,因此我决定自己继续。 共享首选项是使用匕首设置的。 它在 SharedPreferenceManager class 的 saveString 方法中与 NPE 在 putString 行上崩溃。

@Module
public class StudentModule {
    @Provides
    @Singleton
    static Context getContext(Application application) {
        return application.getApplicationContext();
    }

    @Provides
    @Singleton
    static SharedPreferences getSharedPreferences(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context);
    }
}

有一位经理class:

public class SharedPreferenceManager {
    private SharedPreferences sharedPreferences;
    private Context context;
    @Inject public SharedPreferenceManager(SharedPreferences sharedPreferences, Context context){
        this.sharedPreferences=sharedPreferences;
        this.context=context;
    }
    public String doSomething(){

        return sharedPreferences.getString("s","");
    }
    public void saveString(String s){
        System.out.println(sharedPreferences.getClass().getSimpleName());
        SharedPreferences.Editor editor=sharedPreferences.edit();
        editor.putString("s","bis").apply();

    }
}

这是测试:

@RunWith(MockitoJUnitRunner.class)

public class MockTest {
    @InjectMocks
    SharedPreferenceManager sharedPreferenceManager;
    @Mock SharedPreferences sharedPreferences;


    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);



    }
    @Test
    public void isSharedPefWorking(){
        sharedPreferenceManager.saveString("bis");
        assertEquals("bis",sharedPreferenceManager.doSomething());

    }

}

SharedPreferences 使用了一个 SharedPreferences.Editor,你目前没有在模拟它。

您需要执行类似以下操作来模拟和验证您的 SharedPreferenceManager.

的行为
@RunWith(MockitoJUnitRunner.class)
public class MockTest {
    @InjectMocks
    SharedPreferenceManager sharedPreferenceManager;
    @Mock
    SharedPreferences sharedPreferences;
    @Mock
    SharedPreferences.Editor sharedPreferencesEditor;

    final String savedString = "savedString";

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        when(sharedPreferences.edit()).thenReturn(sharedPreferencesEditor);
        when(sharedPreferencesEditor.putString(anyString(), anyString())).thenReturn(sharedPreferencesEditor);
    }

    @Test
    public void saveString() {
        sharedPreferenceManager.saveString(savedString);
        verify(sharedPreferencesEditor).putString("s", savedString);
    }

    @Test
    public void getString() {
        when(sharedPreferences.getString("s","")).thenReturn(savedString);

        String preferenceString = sharedPreferenceManager.doSomething();

        assertEquals(preferenceString, savedString);
    }

}