Протестируйте с помощью JUnit запрос - PullRequest
0 голосов
/ 03 мая 2018

Я хочу протестировать запрос с JUnit с запросом, подобным этому, но RxUtils.applySchedulersAndErrorMapper () возвращает null. Есть ли возможность проверить это?

override fun onContinueClicked(phoneNumber: String) {
    mView.showLoading()
    mUserService.checkUserApprovedStatus(phoneNumber)
                .compose(RxUtils.applySchedulersAndErrorMapper())
                .subscribe({ response ->
                    //Success
                }, { error ->
                    //Error
                })
}

Здесь я настраиваю докладчик и mUserService для докладчика

@Mock
private PhoneContract.View view;

@Mock
private UserService userService;

  @Before
public void setup() {
    presenter = new PhonePresenter(this.view);
    presenter.mUserService = userService;
}

вот метод испытания

 @Test
public void onContinueClicked_SendJustNumbers() {
    String phoneNumber = "(01234567890)";
    // when
    presenter.onContinueClicked(phoneNumber);
    // then
    verify(view, times(1)).showLoading();
}

и вот класс RXUtils:

class RxUtils {
    companion object {

        @SuppressLint("CheckResult")
        fun <E> applySchedulersAndErrorMapper(): ObservableTransformer<E, E> {
            return ObservableTransformer { o ->
                o.flatMap(Function<E, ObservableSource<E>> { element ->
                    val genericResponse = element as GenericResponse<*>
                    @Suppress("UNCHECKED_CAST")
                    return@Function Observable.just(genericResponse as E)
                }).onErrorResumeNext(Function<Throwable, ObservableSource<E>> { t ->
                    if (t is ApiException) {
                        return@Function Observable.error(t)
                    }
                    var genericResponse: GenericResponse<*>? = null

                    return@Function Observable.error(ApiException(t.message ?: "", genericResponse?.result ?: Result()))
                })
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribeOn(Schedulers.io())
            }
        }
    }
}

Вот трассировка стека, где я получаю null для RxUtils.applySchedulersAndErrorMapper ()

java.lang.NullPointerException

1 Ответ

0 голосов
/ 03 мая 2018

Если он относится к SDK, он, вероятно, не будет работать в модульном тесте. Вы не включили свои импортные данные, поэтому невозможно сразу определить, но по опыту я знаю, что вы не можете использовать это в модульном тесте

AndroidSchedulers.mainThread()

Вам нужно заменить это, скажем, Schedulers.trampoline ()

Пример настройки настраиваемого планировщика для тестирования

Обратите внимание, что это только пример, и есть другие допустимые решения.

class RxUtils {
companion object {

    // add this
    @VisibleForTesting var mainScheduler = AndroidSchedulers.mainThread()
    @VisibleForTesting var ioScheduler = Schedulers.io()

    @SuppressLint("CheckResult")
    fun <E> applySchedulersAndErrorMapper(): ObservableTransformer<E, E> {
        return ObservableTransformer { o ->
            o.flatMap(Function<E, ObservableSource<E>> { element ->
                val genericResponse = element as GenericResponse<*>
                @Suppress("UNCHECKED_CAST")
                return@Function Observable.just(genericResponse as E)
            }).onErrorResumeNext(Function<Throwable, ObservableSource<E>> { t ->
                if (t is ApiException) {
                    return@Function Observable.error(t)
                }
                var genericResponse: GenericResponse<*>? = null

                return@Function Observable.error(ApiException(t.message ?: "", genericResponse?.result ?: Result()))
            })
                    .observeOn(mainScheduler)
                    .subscribeOn(ioScheduler)
        }
    }
}

}

И в вашем тесте:

@Before fun setup() {
    RxUtils.mainScheduler = Schedulers.trampoline()
    RxUtils.ioScheduler = Schedulers.trampoline()
}

@After fun teardown() {
    RxUtils.mainScheduler = AndroidSchedulers.mainThread()
    RxUtils.ioScheduler = Schedulers.io()
}

РЕДАКТИРОВАТЬ в ответ на обновленное сообщение с дополнительной информацией о тесте

Прежде всего, вы должны опубликовать ПУТЬ БОЛЬШЕ КОДА. Это расстраивает необходимость вытаскивать это из вас с помощью сгустков крови. Тем не мение. У вас есть следующее:

@Mock
private UserService userService;

Это создает насмешку UserService, конечно, но это не заглушка ничего. Когда вы звоните userService.anyFunctionAtAll(), он вернет ноль по умолчанию. Там твой NPE. Вы должны заглушить это. Например:

Mockito.when(userService.anyFunctionAtAll()).thenReturn(somePredeterminedValue)

Для получения дополнительной информации см. Веб-сайт Mockito .

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