Может кто-нибудь сказать мне, почему оператор обмена в RxJava2 (v2.2.4) не работает, как утверждено в моем модульном тесте? - PullRequest
0 голосов
/ 07 июня 2019

Основываясь на моем понимании оператора share, я написал следующий тест:

@Test
fun `share operator`() {
  val expectedInvocations = 1
  val counter = AtomicInteger()
  val shared = Completable.fromCallable { counter.incrementAndGet() }
    .toObservable<Any>()
    .share()
    .ignoreElements()

  Completable.merge(listOf(shared, shared)).test()

  assertThat(counter.get()).isEqualTo(expectedInvocations)
}

Как можно видеть, я ожидаю, что если я поделюсь наблюдаемой и несколько наблюдателей подписываются одновременно,вызываемый будет вызываться только один раз.Однако, когда я запускаю этот тест, он не проходит, так как вызываемый объект вызывается дважды.

1 Ответ

1 голос
/ 07 июня 2019

http://reactivex.io/RxJava/javadoc/io/reactivex/Completable.html

слияние (Итерируемые источники)

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

подписывается на все источники одновременно а также завершается только после завершения всех исходных завершений

Таким образом, оба завершаемых действия приводятся в действие, что делает ваш счетчик 2.


Интересная прочитанная поясняющая доля: https://medium.com/mindorks/how-to-use-rxjava-share-operator-26b08973771a

...