测试RxJava BehaviorProcessor是否发出值

时间:2017-12-26 18:45:42

标签: java unit-testing junit4 rx-java2

我无法理解为什么所有这些处理器都通过了测试但Behavior没有通过测试:

package com.example;

import org.junit.Test;

import io.reactivex.Flowable;
import io.reactivex.processors.*;

public class ProcessorTest {
    private static Flowable<String> justFoo() {
        return Flowable.just("foo");
    }

    private static FlowableProcessor<String> subscribeToFoo(
            FlowableProcessor<String> processor) {
        justFoo().subscribe(processor);
        return processor;
    }

    @Test public void flowable() {  // pass
        justFoo().test().assertValue("foo");
    }

    @Test public void async() {  // pass
        subscribeToFoo(AsyncProcessor.create()).test().assertValue("foo");
    }

    @Test public void replay() {  // pass
        subscribeToFoo(ReplayProcessor.create()).test().assertValue("foo");
    }

    @Test public void unicast() {  // pass
        subscribeToFoo(UnicastProcessor.create()).test().assertValue("foo");
    }

    @Test public void behaviorFail() {  // fail
        subscribeToFoo(BehaviorProcessor.create()).test().assertValue("foo");
    }

    @Test public void behaviorPassing() {  // pass
        subscribeToFoo(BehaviorProcessor.create())
                .test()
                .assertNoValues()
                .assertSubscribed()
                .assertComplete()
                .assertNoErrors()
                .assertNoTimeout()
                .assertTerminated();
    }
}

文档说BehaviorProcessor是:

  

处理器发出它观察到的最新项目以及每个订阅订阅者的所有后续观察项目。

因此,根据我的理解,它应该通过behaviorFail测试,而不是behaviorPassing。那怎么样?

我如何编写有效的测试,知道BehaviorProcessor发出了某个值?

1 个答案:

答案 0 :(得分:0)

摆脱传递给处理器的终端事件会有所帮助:

@Test public void behavior() {
    final BehaviorProcessor<String> processor = BehaviorProcessor.create();
    justFoo().concatWith(Flowable.never()).subscribe(processor);
    processor.test().assertValue("foo");
}
相关问题