Наши модульные тесты выполняются следующим образом: Операции, выполняемые в асинхронных потоках 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
, и мне нужно будет также проверить эти случаи, и более конкретно, если они вызвали ожидаемые события.