Project Reactor:等待播音员完成

时间:2015-11-14 12:42:27

标签: unit-testing asynchronous project-reactor reactive-streams

有一个Broadcaster,它接受字符串并将它们附加到StringBuilder。

我想测试它。

我必须使用Thread#sleep等待,而广播公司完成字符串的处理。我想删除sleep

我尝试使用Control#debug()失败了。

public class BroadcasterUnitTest {

@Test
public void test() {
    //prepare
    Environment.initialize();
    Broadcaster<String> sink = Broadcaster.create(Environment.newDispatcher()); //run broadcaster in separate thread (dispatcher)
    StringBuilder sb = new StringBuilder();
    sink
            .observe(s -> sleep(100)) //long-time operation
            .consume(sb::append);

    //do
    sink.onNext("a");
    sink.onNext("b");

    //assert
    sleep(500);//wait while broadcaster finished (if comment this line then the test will fail)
    assertEquals("ab", sb.toString());
}

private void sleep(int millis) {
    try {
        Thread.sleep(millis);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}
}

1 个答案:

答案 0 :(得分:0)

我不熟悉Broadcaster(由于这个问题已经过时,它可能已被弃用),但这三种方式可能会有所帮助:

  1. 在测试Project-Reactor的{​​{1}} es和东西时,你可能更好地使用专门为此制作的测试库。 Their reference以及该部分的Javadoc非常好,我只想复制一个在这里说明一切的例子:

    Flux
  2. 您可以在@Test public void testAppendBoomError() { Flux<String> source = Flux.just("foo", "bar"); StepVerifier.create( appendBoomError(source)) .expectNext("foo") .expectNext("bar") .expectErrorMessage("boom") .verify(); } es和block()上自己Flux然后运行检查。请注意,如果发出错误,则会导致异常。但有一种感觉,你会发现自己需要为某些情况编写更多代码(例如,检查Mono已发出2项Flux&amp; X然后因错误而终止)并且您然后重新实施Y

    StepVerifier
  3. 您可以使用常规解决方案进行异步测试,例如CountDownLatch,但是,在某些情况下,我们不建议会给您带来麻烦。例如,如果您事先不知道接收器的数量,则需要使用其他东西。