Я не могу проверить SharedPreference с помощью Mockito - PullRequest
0 голосов
/ 05 февраля 2019

Я не могу смоделировать sharedPreference, и когда я тестирую своего докладчика, экземпляр sharepreference становится пустым.

@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);
                        }));
    }

1 Ответ

0 голосов
/ 06 февраля 2019

Вы проводите юнит-тесты?По умолчанию любые вызовы платформы Android изнутри модульного теста выдают исключение.

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

Вы можете контролировать и проверять элементы платформы Android с помощьюс которым ваше приложение взаимодействует, выполняя модульные тесты с измененной версией android.jar, которая не содержит никакого кода.Поскольку вызовы вашего приложения к платформе Android по умолчанию генерируют исключения, вам нужно заглушить каждое из этих взаимодействий с помощью насмешливой платформы, такой как Mockito.

У вас есть несколько вариантов:

  1. Инкапсулируйте код, взаимодействующий с SharedPreferences, в отдельный класс и смоделируйте этот класс с Mockito при тестировании вашего Presenter
  2. Использование Robolectric , который обеспечиваетреализация Android SDK
  3. Запуск инструментальных тестов (androidTest) вместо юнит-тестов (test)

Я бы порекомендовал # 1, так как этот подход позволяет продолжитьзапуск быстрых тестов JUnit без необходимости использования Robolectric.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...