我该如何使用带有Project Reactor Stepverifier的RxJava测试没有事件的逻辑?

时间:2018-06-29 08:51:51

标签: junit project-reactor

我目前正在试图弄清楚如何在Project Reactor中进行类似的测试。 基本上,我想确保在连接之前不会发生任何事件。

@Test
void connectable() {
    Observable<String> provider = Observable.just("Test1", "Test2");
    ConnectableObservable<String> connectable = provider.publish();
    TestObserver<String> testSubscriber = connectable.test();
    testSubscriber.assertEmpty();
    connectable.connect();
    testSubscriber.assertResult("Test1", "Test2").assertComplete();
}

这是我目前的尝试,但这是不正确的,我如何使它起作用?

@Test
void connectable() {
    Flux<String> provider = Flux.just("Test1", "Test2");
    ConnectableFlux<String> connectable = provider.publish();
    FirstStep<String> tester = StepVerifier.create(connectable).expectNoEvent(Duration.ofMinutes(1));
    connectable.connect();
    tester.expectNext("Test1", "Test2").expectComplete().verify();
}

1 个答案:

答案 0 :(得分:1)

您快到了。 StepVerifier测试整个序列,您不能在中间添加命令式断言。但是您可以在StepVerifier内进行断言和状态修改调用!为此,请使用then(Runnable)

@Test
public void stepVerifierTestConnect() {
    Flux<String> provider = Flux.just("Test1", "Test2");
    ConnectableFlux<String> connectable = provider.publish();

    StepVerifier.create(connectable)
                .expectSubscription() //expectNoEvent counts the subscription as an event
                .expectNoEvent(Duration.ofSeconds(3))
                .then(connectable::connect)
                .expectNext("Test1", "Test2")
                .expectComplete()
                .verify();
}

请首先注意expectSubscription。这样可以避免expectNoEvent爆炸,因为它会将订阅行为视为一个事件(并且仍然有对ConnectableFlux本身的订阅-它只是阻止订阅自己的上游,直到您调用{{1 }}。