有一个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);
}
}
}
答案 0 :(得分:0)
我不熟悉Broadcaster
(由于这个问题已经过时,它可能已被弃用),但这三种方式可能会有所帮助:
在测试Project-Reactor
的{{1}} es和东西时,你可能更好地使用专门为此制作的测试库。 Their reference以及该部分的Javadoc非常好,我只想复制一个在这里说明一切的例子:
Flux
您可以在@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
您可以使用常规解决方案进行异步测试,例如CountDownLatch,但是,在某些情况下,我们不建议会给您带来麻烦。例如,如果您事先不知道接收器的数量,则需要使用其他东西。