Как я могу проверить содержание Потребителя выполняется в случае ошибки? - PullRequest
0 голосов
/ 07 февраля 2020

Наши модульные тесты выполняются следующим образом: Операции, выполняемые в асинхронных потоках c, обрабатываются в классе делегирования. Это облегчает наше тестирование, поскольку мы можем передать другой экземпляр этого интерфейса экземпляру моделей в наших тестовых классах.

Преобразование многих аспектов приложения в Rx Java создало трудности для тестирования случаи Throwable.

Я упрощу код, чтобы его можно было лучше понять.

Допустим, интерфейс BaseAsync реализован следующим образом:

class BaseAsyncImpl : BaseAsync {
    override fun <T, R> single(item: T, map: (T) -> R, onSuccess: Consumer<in (T) -> R>, onError: Consumer<in Throwable>) {
        Single.just(item)
                .map { map }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(onSuccess, onError)
    }
}

Каждое место приложения, где у нас есть сингл, выполняется как положено.

Однако на нашем TestBaseAsync мы имеем следующее:

    override fun <T, R> single(item: T, map: (T) -> R, onSuccess: Consumer<in (T) -> R>, onError: Consumer<in Throwable>) {
            Single.just(item)
                    .map { map }
                    .subscribe(onSuccess)
    }

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

Теперь я не могу понять, как проверить onError не только при возникновении ошибки, но и при ожидаемых событиях.

Я пробовал следующее:

var hasError: Boolean = false

fun setError(hasError: Boolean) {
    this.hasError = hasError
}

    override fun <T, R> single(item: T, map: (T) -> R, onSuccess: Consumer<in (T) -> R>, onError: Consumer<in Throwable>) {
            Single.just(item)
                    .filter { !hasError }
                    .map { map }
                    .subscribe(onSuccess)

            Single.just(item)
                    .filter { hasError }
                    .map { throw Throwable() }
                    .subscribe(onSuccess, onError)
    }

Но я не знаю, как я могу отловить ошибку и проверить, было ли выполнено содержимое onError Throwable соответствующим образом.

Тест останавливается, и я получаю java.lang.Throwable.

В своем тесте я добавил объявленный @Test(expected = Throwable::class) Содержание теста выглядит примерно так:

@Test(expected = Throwable::class)
fun `WHEN we have an error THEN we fire the handling event`() {
setError(true)
paymentModel.getTransaction()
verify(event).post(ErrorRedirection)
}

и в начале мы также установили модель вместе с объектом делегирования следующим образом:

  @Before
  fun setUp() {
  paymentModel = PaymentModel(testBaseAsync)
}

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

...