[Day 17] Reactive Programming - Reactor Test(StepVerifier)

前言

在之前的Reactor相关范例中,如果需要测试结果是否符合预期,都必须要透过System.out.println来印出结果人工检视,有时候还必须加上Thread.sleep()来辅助,就算是这样你都能接受,正式专案通常都有ci/cd来跑测试,这时候总不能还是透过人工去看console,好在Reactor在测试方面也有提供方便的工具给开发者。

StepVerifier

提供了声明式的方式来做验证,预期的事件或是下一个传递的值甚至连时间都可以控制。来看一下官方提供的范例:

首先是一个appendBoomError(),将传入的Flux绑上一个内含Error,觉得这个命名很传神,就是包裹炸弹一样。
StepVerifier透过builder的方式,在create内传入需要验证的publisherexpectNext就是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

  1. expectNext:下一个item与传入的相同。
  2. expectNextMatches(Predicate):比较复杂的判断可以传入Predicate
  3. assertNext(Consumer):直接传入assertions
  4. expectNextCount(long):在下一个讯号之前的item数量
  5. expectNextSequence(Iterable):一次比对多个item

因为error&complete都是终结(terminal)讯号,也就是之後不会再有後续动作,所以可以与verify结合

  1. verifyComplete():publisher结束,传入已完成的讯号(completion signal)
  2. verifyError(): publisher结束,但是因为有错误发生(unspecified error)
  3. 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天程序语言研究

今天是30天程序语言研究的第七天,研究的语言一样是python,今天主要学习的是while和猜数字游...

ViewModel 中的 UI 状态 - 以 Selection state 为例

在一个应用程序中,有着各种不同类型的资料,这些不同的资料也有属於他们的生命周期,有些资料就像之前介绍...

Day 17 - Primitive and Reference

Primitive Data Types 变数拥有值,当某个变数的值赋予给其他变数时,是采用复制的方...

【第三天 - Stack 题目分析】

先简单回顾一下,今天预计分析的题目: Valid Parentheses 昨天问到,如果 ([)] ...

企划实现(10)

FB登入 第一步:到FB官网并创建帐号 https://developers.facebook.co...