Rx java подписаться 3 раза, а вызов только 2 раза - PullRequest
0 голосов
/ 27 мая 2020

Я считаю, что есть большой пробел в моем понимании Rx Java

предположим, что у нас есть этот интерфейс:

 interface SecretInterface {
    fun getSecretKey(): Single<Int>
  }

  interface Vault {
    fun openSecret(): Single<String>
  }

, а затем у меня есть этот тест:

 @Test
  fun should_check_on_this() {
    val mockSecret = mock<SecretInterface> {
      on { this.getSecretKey() }.thenReturn(Single.just(1), Single.just(2),
          Single.just(3))
    }

    val mockVault = mock<Vault> {
      on { this.openSecret() }.thenReturn(Single.error(Exception("no can do")),
          Single.just("secret opened"))
    }

    val complexStuff = mockSecret.getSecretKey().doOnSuccess {
      System.err.println("onSuccess secret top $it")
    }.flatMap {
      mockVault.openSecret()
    }.retryWhen {
      it.flatMapSingle {
        mockSecret.getSecretKey().doOnSuccess { System.err.println("onSuccess secret bottom: $it") }
      }
    }

    val test = complexStuff.test()
    test.assertValue { it == "secret opened" }
    verify(mockSecret, Times(3)).getSecretKey()
  }

тест не удался, потому что mockSecret.getSecretKey () вызывается только дважды, но на выходе:

onSuccess secret top 1
onSuccess secret bottom: 2
onSuccess secret top 1

org.mockito.exceptions.verification.TooFewActualInvocations: 
secretInterface.getSecretKey();
Wanted 3 times:

вещи, которые я не могу понять:

    -It's already resubscribed, but how come still using old value?
    -How I can make it, that every time I resubscribed always return the latest value?
  in this case it should return 3 not 1.

спасибо ты

...