我目前正在试图弄清楚如何在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();
}
答案 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 }}。