我不能嘲笑sharedPreferences,当我测试我的演讲,然后共享偏好实例为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-environment:
您可以控制并验证与您的应用程序通过针对的android.jar的修改版本,它不包含任何代码运行单元测试交互的Android框架的要素。因为你的应用程序的调用默认的Android框架抛出异常,则需要使用一个模拟框架,如要的Mockito存根出这些相互作用的每一个。
您有几种选择在这里:
SharedPreferences
在一个单独的类交互的代码,并模拟出该类测试的Mockito您的演示时androidTest
)代替单元测试(test
)我会建议#1,因为这种方法允许你继续,而不必应付Robolectric的开销,运行速度快JUnit测试。