gpt4 book ai didi

unit-testing - react 堆项目 : wait while broadcaster finish

转载 作者:行者123 更新时间:2023-12-05 05:24:45 25 4
gpt4 key购买 nike

有一个 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);
}
}
}

最佳答案

我不熟悉 Broadcaster(并且它可能已被弃用,因为这个问题已经过时了),但是这 3 种方式通常会有所帮助:

  1. 在测试 Project-ReactorFluxes 和东西时,最好使用他们专门为此制作的测试库。 Their referenceJavadoc在这方面非常好,我将在这里复制一个不言而喻的例子:

    @Test
    public void testAppendBoomError() {
    Flux<String> source = Flux.just("foo", "bar");
    StepVerifier.create(
    appendBoomError(source))
    .expectNext("foo")
    .expectNext("bar")
    .expectErrorMessage("boom")
    .verify();
    }
  2. 您可以自己在 FluxMonoblock() 然后运行检查。请注意,如果发出错误,这将导致异常。但是有一种感觉,您会发现自己需要为某些情况编写更多代码(例如,检查 Flux 发出了 2 个项目 XY 然后因错误而终止),然后您将重新实现 StepVerifier

    @Test
    public void testFluxOrMono() {
    Flux<String> source = Flux.just(2, 3);
    List<Integer> result = source
    .flatMap(i -> multiplyBy2Async(i))
    .collectList()
    .block();
    // run your asserts on the list. Reminder: the order may not be what you expect because of the `flatMap`
    // Or with a Mono:
    Integer resultOfMono = Mono.just(5)
    .flatMap(i -> multiplyBy2Async(i))
    .map(i -> i * 4)
    .block();
    // run your asserts on the integer
    }
  3. 您可以使用通用解决方案进行异步测试,例如 CountDownLatch ,但是,同样,不推荐并且在某些情况下会给你带来麻烦。例如,如果您事先不知道接收器的数量,则需要使用其他东西。

关于unit-testing - react 堆项目 : wait while broadcaster finish,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33708515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com