Обратите внимание, что ответ, за который здесь больше голосов, немного вводит в заблуждение. См. Пример ниже, моя идея состоит в том, чтобы показать некоторые сценарии тестирования и показать, как ведет себя завершаемая логика с оператором andThen
.
private fun doThingAFail(): Completable {
print("Do thingA Called\n")
return Completable.fromCallable {
print("calling stream A\n")
throw(Exception("The excep"))
}
}
private fun doThingB(): Completable {
print("Do thingB Called\n")
return Completable.fromCallable {
print("calling stream B\n")
}
}
private fun doThingA(): Completable {
print("Do thingA Called\n")
return Completable.fromCallable {
print("calling stream A\n")
}
}
Обратите внимание на это для теста ниже:
@Test
fun testCallAPlusB() {
doThingA().andThen(doThingB())
}
Краткое примечание: обратите внимание, что мы не подписываемся на эти Completables в этом фрагменте.
вывод будет:
Do thingA Called
Do thingB Called
Для теста:
@Test
fun theTestSubscribe() {
doThingA().andThen(doThingB()).subscribe()
}
Результатом будет:
Do thingA Called
Do thingB Called
calling stream A
calling stream B
И, наконец, в случае сбоя первой таблицы завершения вторая таблица завершения не будет выполняться.
@Test
fun theTestFailThingA() {
doThingAFail().andThen(doThingB()).subscribe()
}
вывод будет:
Do thingA Called
Do thingB Called
calling stream A
Ключевой концепцией здесь является то, что логика внутри метода и внутри наблюдаемого выполняется не одновременно. Строки Do thingA Called и Do thingB Called будут напечатаны после того, как мы вызовем методы doThingA()
и doThingB()
. В то время как линии вызывающего потока A и вызывающего потока B будут вызываться только тогда, когда кто-то подписывается на методы doThingA
и doThingB
.
Вторая концепция заключается в том, как оператор andThen будет обрабатывать ошибки. В приведенном выше примере, если doThingA()
completable завершается с ошибкой, поток завершится и не будет печатать строку B вызывающего потока.
person
camposbrunocampos
schedule
30.03.2021