我无法用SharedPreference到的Mockito测试

问题描述 投票:0回答:1

我不能嘲笑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 testing mockito preferences
1个回答
0
投票

你运行单元测试?默认情况下,从一个单元测试内Android框架的任何调用将抛出异常。

https://developer.android.com/training/testing/fundamentals#interact-android-environment

您可以控制并验证与您的应用程序通过针对的android.jar的修改版本,它不包含任何代码运行单元测试交互的Android框架的要素。因为你的应用程序的调用默认的Android框架抛出异常,则需要使用一个模拟框架,如要的Mockito存根出这些相互作用的每一个。

您有几种选择在这里:

  1. 封装与SharedPreferences在一个单独的类交互的代码,并模拟出该类测试的Mockito您的演示时
  2. 使用Robolectric,它提供了Android SDK中的实现
  3. 运行仪表测试(androidTest)代替单元测试(test

我会建议#1,因为这种方法允许你继续,而不必应付Robolectric的开销,运行速度快JUnit测试。

© www.soinside.com 2019 - 2024. All rights reserved.