在之前的Reactor相关范例中,如果需要测试结果是否符合预期,都必须要透过System.out.println
来印出结果人工检视,有时候还必须加上Thread.sleep()
来辅助,就算是这样你都能接受,正式专案通常都有ci/cd来跑测试,这时候总不能还是透过人工去看console,好在Reactor在测试方面也有提供方便的工具给开发者。
提供了声明式的方式来做验证,预期的事件或是下一个传递的值甚至连时间都可以控制。来看一下官方提供的范例:
首先是一个appendBoomError()
,将传入的Flux
绑上一个内含Error,觉得这个命名很传神,就是包裹炸弹一样。
StepVerifier
透过builder的方式,在create
内传入需要验证的publisher
,expectNext
就是onNext
,预期下一个data是否符合,也能够预期错误发生,最後verify
就是像subscribe
一样,当作一个启动开始测试。
public <T> Flux<T> appendBoomError(Flux<T> source) {
return source.concatWith(Mono.error(new IllegalArgumentException("boom")));
}
@Test
public void testAppendBoomError() {
Flux<String> source = Flux.just("package1", "package2");
StepVerifier.create(
appendBoomError(source))
.expectNext("package1")
.expectNext("package2")
.expectErrorMessage("boom")
.verify();
}
简单条列一下常用的expect
expectNext
:下一个item与传入的相同。expectNextMatches(Predicate)
:比较复杂的判断可以传入Predicate
assertNext(Consumer)
:直接传入assertions
expectNextCount(long)
:在下一个讯号之前的item数量expectNextSequence(Iterable)
:一次比对多个item因为error&complete都是终结(terminal)讯号,也就是之後不会再有後续动作,所以可以与verify
结合
verifyComplete()
:publisher结束,传入已完成的讯号(completion signal)verifyError()
: publisher结束,但是因为有错误发生(unspecified error)verifyErrorMessage()
:多加上判断message//DefaultStepVerifierBuilder.java Source code
@Override
public Duration verifyError() {
return expectError().verify();
}
@Override
public Duration verifyComplete() {
return expectComplete().verify();
}
@Override
public Duration verifyErrorMessage(String errorMessage) {
return expectErrorMessage(errorMessage).verify();
}
最後一个准备一个起始为3总数7个的Flux,透过上面介绍expectNextSequence
一次比对五个item,下一个数字8刻意用Predicate
判断,expectNextCount
我自己有点难懂,直到实际观察他的行为才知道比较像是到下一个expect
之前还有的数量,在这边已经有6个item了,所以只会剩下一个而已,最後就是使用verifyComplete
结合expectComplete
&verify
。
@Test
public void verify(){
Flux<Integer> integers = Flux.range(3,7);
StepVerifier.create(integers)
.expectNextSequence(Arrays.asList(3,4,5,6,7))
.expectNextMatches(d -> (d / 2 ) == 4)
.expectNextCount(1)
.verifyComplete();
}
如果想要更多的练习,有找到一个很棒的resource,reactor 官方github上的hands-on,里面有非常多Test的范例。
<<: TypeOrm | Repository APIs 用法纪录 3
>>: Shadow Element:条件控制元件的创建、消灭
今天是30天程序语言研究的第七天,研究的语言一样是python,今天主要学习的是while和猜数字游...
在一个应用程序中,有着各种不同类型的资料,这些不同的资料也有属於他们的生命周期,有些资料就像之前介绍...
Primitive Data Types 变数拥有值,当某个变数的值赋予给其他变数时,是采用复制的方...
先简单回顾一下,今天预计分析的题目: Valid Parentheses 昨天问到,如果 ([)] ...
FB登入 第一步:到FB官网并创建帐号 https://developers.facebook.co...