Kotlin 超时测试不返回TimeoutException-rxjava

Kotlin 超时测试不返回TimeoutException-rxjava,kotlin,rx-java,rx-java2,Kotlin,Rx Java,Rx Java2,测试失败,因为没有引发异常。它只是完成,而不是超时 @Test fun timeout() { val testScheduler = TestScheduler() val sub = Observable.just(true) .filter{ it -> !it } .timeout(10, TimeUnit.SECONDS, testScheduler)

测试失败,因为没有引发异常。它只是完成,而不是超时

    @Test
    fun timeout() {
        val testScheduler = TestScheduler()

        val sub = Observable.just(true)
                .filter{ it -> !it }
                .timeout(10, TimeUnit.SECONDS, testScheduler)

        val testSubscriber = sub.subscribeOn(testScheduler).test()

        testScheduler.advanceTimeBy(20, TimeUnit.SECONDS)
        testSubscriber.assertError(TimeoutException::class.java)
    }

我在这个街区已经呆了一个多小时了,我不明白为什么会失败。这可能是非常明显的事情,但我觉得我需要另一双眼睛来为我指出这一点。

这里有一个测试可以得到预期的结果:

@Test
fun timeout() {
    val testScheduler = TestScheduler()

    val sub = Observable.just(true) // 1
            .delaySubscription(Observable.never<Boolean>()) // 2
            .timeout(10, TimeUnit.SECONDS, testScheduler) // 3
    val testSubscriber = sub.subscribeOn(testScheduler).test()

    testScheduler.advanceTimeBy(20, TimeUnit.SECONDS)
    testSubscriber.assertError(TimeoutException::class.java)
@测试
乐趣超时(){
val testScheduler=testScheduler()
val sub=可观察的。刚好(真)//1
.delaySubscription(Observable.never())//2
.timeout(10,TimeUnit.SECONDS,testScheduler)//3
val testSubscriber=sub.subscribeeon(testScheduler.test())
testScheduler.advanceTimeBy(20,时间单位。秒)
testSubscriber.assertError(TimeoutException::class.java)
下面是对发生的事情的解释:

  • 我们只需要一个
    可观察的
    ,开始时,您之前使用的过滤器只是将此设置为空
  • 我们想要解决一些无法完成的问题,因此一种选择是
    可观察的
    ,而不是
    从不
    发出的
  • 从现在起,一切都和你一样

  • just
    是一个有限的源代码,序列完成时没有任何项目,没有延迟。您试图完成什么?啊,当然……我想您可以将其更改为
    observatable.fromCallable(()->{return true;})
    ,它将按预期运行。
    just
    是一个阻塞调用。@Tuby这完全错误。@Tuby
    fromCallable
    仍然是有限的,但是OP试图复制一个热的、非终止的
    Observable
    。而且
    just
    不是阻塞的,而是同步的。+1“因此,一个替代方案是可观测的而不是从不发射”。在我的测试中,原始可观测的仍在发射有效的
    onNext()
    ,因此如果提前时间,成功的发射将在
    timeout()
    有机会发送异常之前发送。