我无法使用Mockito测试SharedPreference



我无法模拟sharedPreference,当我测试演示者时,sharepreference实例为null。

@RunWith(MockitoJUnitRunner.class)
public class PreferencesPresenterTest {
@Mock
PreferencesMvpView preferencesMvpView;
@Mock
ApiService apiService;
@Mock
Context context;
@Mock
SchedulerProvider mSchedulerProvider;
PreferencesPresenter mPresenter;

@Before
public void setUp() throws Exception {
CompositeDisposable compositeDisposable = new CompositeDisposable();
mPresenter = new PreferencesPresenter(compositeDisposable, apiService, mSchedulerProvider);

// mPrefences = new AppPreferences();
mPresenter.onAttach(preferencesMvpView);
}
@Test
public void testFilter() throws Exception {
Mockito.when(mSchedulerProvider.getUiScheduler()).thenReturn(Schedulers.trampoline());
Mockito.when(mSchedulerProvider.getWorkerScheduler()).thenReturn(Schedulers.trampoline());

mPresenter.loadPreferenceData();
}

}

//这是我正在测试的方法

@Override
public void loadPreferenceData() {
long userId = mPreferences.getLong(AppPreferences.USER_ID);
getMvpView().showLoading();
getCompositeDisposable().add(getApiService().getPreferencesData(userId)
.subscribeOn(getSchedulerProvider().getWorkerScheduler())
.observeOn(getSchedulerProvider().getUiScheduler())
.subscribe(
jsonObject -> {
//Log.d(getClass().getSimpleName(), "PreferencesPresenter : loadPreferenceData: onSuccess");
if (!isViewAttached()) {
return;
}
getMvpView().hideLoading();
if (jsonObject != null && AppUtils.containsValue(jsonObject, JsonKeys.DATA))
setupFieldList(new Gson().fromJson(jsonObject.get(JsonKeys.DATA), Preferences.class));
}
, throwable -> {
// Log.d(getClass().getSimpleName(), "PreferencesPresenter : loadPreferenceData: Error");
if (!isViewAttached()) {
return;
}
getMvpView().hideLoading();
handleApiError(throwable);
}));
}

您正在运行单元测试吗?默认情况下,单元测试中对Android框架的任何调用都会引发异常。

发件人https://developer.android.com/training/testing/fundamentals#interact-android环境:

您可以通过对不包含任何代码的Android.jar修改版本运行单元测试来控制和验证应用程序与之交互的Android框架的元素。因为你的应用程序对Android框架的调用默认情况下会抛出异常,所以你需要使用Mockito等嘲讽框架来截取这些交互中的每一个。

这里有几个选项:

  1. 将与SharedPreferences交互的代码封装在一个单独的类中,并在测试Presenter时使用Mockito模拟该类
  2. 使用Robolectric,它提供了Android SDK的实现
  3. 运行插入指令的测试(androidTest),而不是单元测试(test)

我推荐#1,因为这种方法可以让你继续运行快速的JUnit测试,而不必处理Robolectric的开销。

相关内容

  • 没有找到相关文章

最新更新