Ведущий тестирования, который содержит CompositeDisposable - PullRequest
0 голосов
/ 05 сентября 2018

Я пытался создать модульный тест для моего класса презентатора, использующего RxJava CompositeDisposable, но он всегда выдавал исключение нулевого указателя.

Это мой класс докладчика:

class LastMatchPresenter(val mView :  MatchContract.View,
                     val matchRepositoryImpl: MatchRepositoryImpl,
                     val scheduler: SchedulerProvider) : MatchContract.Presenter{

    val compositeDisposable = CompositeDisposable()

    override fun getFootballMatchData() {
        mView.showLoading()
        compositeDisposable.add(matchRepositoryImpl.getFootballMatch("4328")
                .observeOn(scheduler.ui())
                .subscribeOn(scheduler.io())
                .subscribe{
                    mView.displayFootballMatch(it.events)
                    mView.hideLoading()
                })
    }
}

Это тестовый класс:

class LastMatchPresenterTest {

    @Mock
    lateinit var mView: MatchContract.View

    @Mock
    lateinit var matchRepositoryImpl: MatchRepositoryImpl

    lateinit var scheduler: SchedulerProvider

    lateinit var mPresenter: LastMatchPresenter

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        scheduler = TestSchedulerProvider()
        mPresenter = LastMatchPresenter(mView, matchRepositoryImpl, scheduler)
    }

    @Test
    fun getFootballMatchData() {
        mPresenter.getFootballMatchData()
        mView.showLoading()
    }
}

когда я запустил тест, я получил следующую ошибку:

java.lang.NullPointerException
at com.rahmat.app.footballclub.feature.lastmatch.LastMatchPresenter.getFootballMatchData(LastMatchPresenter.kt:20)
at com.rahmat.app.footballclub.feature.lastmatch.LastMatchPresenterTest.getFootballMatchData(LastMatchPresenterTest.kt:43)

Где это указывает на:

Эта строка .observeOn(scheduler.ui())

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

matchRepositoryImpl.getFootballMatch ("4328"), вероятно, возвращает ноль. Вы смоделировали matchRepositoryImpl, но не смоделировали метод getFootballMatch для него. Это быстро догадаться.

Кстати, я предлагаю вам попробовать MockK, если вы тестируете с помощью Kotlin

0 голосов
/ 05 сентября 2018

Вы должны смоделировать matchRepositoryImpl.getFootballMatch("4328") метод, подобный этому:

Mockito.`when`(matchRepositoryImpl.getFootballMatch("4328"))
        .thenReturn(Observable.just(OBJECT_YOU_WANT_TO_BE_RETURNED))

Вы можете поместить этот макет в блок @Before или, в частности, в тест.

0 голосов
/ 05 сентября 2018

Я не знаю, может ли это помочь вам.

Но я дам вам немного своего кода, когда у меня будут Presenter и PresenterTest.

Presenter:

...
private void loadRepos() {
        disposableManager.add(repoRepository.getTrendingRepos()
                .doOnSubscribe(__ -> viewModel.loadingUpdated().accept(true))
                .doOnEvent((d, t) -> viewModel.loadingUpdated().accept(false))
                .doOnSuccess(__ -> viewModel.reposUpdated().run())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(dataSource::setData, viewModel.onError()));
        }
...

Я наблюдаю изменения в mainThread, но в своем тесте я меняю планировщик для его запуска.

И в PresenterTest я добавляю это для запуска тестов.

PresenterTest:

public class TrendingReposPresenterTest {

    static {
        RxAndroidPlugins.setInitMainThreadSchedulerHandler(schedulerCallable -> Schedulers.trampoline());
    }

...

  private void initializePresenter() {
            presenter = new TrendingReposPresenter(viewModel, repoRepository,
                    screenNavigator,Mockito.mock(DisposableManager.class),dataSource);
        }

Вот мой одноразовый класс менеджера для обработки наблюдаемых.

DisposableManager

public class DisposableManager {

    private final CompositeDisposable compositeDisposable = new CompositeDisposable();

    public void add(Disposable... disposables) {
        compositeDisposable.addAll(disposables);
    }

    public void dispose() {
        compositeDisposable.clear();
    }
}

Надеюсь, это поможет вам. Но я не уверен, что это твоя проблема

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