RxJava + Модифицированный модульный тест Kotlin всегда не удался - PullRequest
0 голосов
/ 15 сентября 2018

Я пытался создать Unit Test с помощью Rxjava + Retrofit, но он всегда выдавал ошибку.

Я перепробовал все учебники и справочные материалы по моим вопросам. Я добился успеха, когда создал модульное тестирование другого метода (другой случай), но в этом случае потерпел неудачу (Rx + модернизация).

Код запроса данных:

fun getDetailEvent(idEvent: String?) {
        view.showLoading()
        apiService.getDetailEvent(idEvent)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe {
                    val compositeDisposable: CompositeDisposable? = null
                    compositeDisposable?.add(it)
                }
                .doFinally { view.hideLoading() }
                .subscribe({
                    val listModel = it
                    if (listModel != null) {
                        view.onDetailEventLoaded(listModel)
                    } else {
                        view.onDetailEventLoadFailed("Empty or Error List")
                    }
                },
                        {
                            val errorMessage = it.message
                            if (errorMessage != null) {
                                view.onDetailEventLoadFailed(errorMessage)
                            }
                        })
    }

Код юнит-теста:

class DetailNextMatchPresenterTest {

    @Mock
    private lateinit var view : DetailNextMatchView

    @Mock
    private lateinit var apiService: ApiService

    private lateinit var presenter: DetailNextMatchPresenter

    @Before
    fun setup(){
        MockitoAnnotations.initMocks(this)
        presenter = DetailNextMatchPresenter(view, apiService)


    }

    @Test
    fun getDetailEvent() {
        val event : MutableList<EventModel> = mutableListOf()
        val response = ResponseEventModel(event)
        val idEvent = "44163"

        `when`(apiService.getDetailEvent(idEvent)
                .test()
                .assertSubscribed()
                .assertValue(response)
                .assertComplete()
                .assertNoErrors()
        )

        presenter.getDetailEvent(idEvent)

        verify(view).showLoading()
        verify(view).onDetailEventLoaded(response)
        verify(view).hideLoading()
    }
}

Я ценю все предложения. Спасибо

1 Ответ

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

Я считаю, что проблема в том, что вы не заставляли свой код работать синхронно в контексте вашего теста, поэтому Observable работает параллельно вашему тесту.Попробуйте добавить это в свой метод установки:

RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() } Если вы используете RxJava2.Попробуйте найти похожий метод, если вы используете RxJava 1.

...