Mono 와 Flux 의 비동기 스트림을 단계별로 검증하는 테스트 도구로, projectreactor:reactor-test에 포함되어있다.
주 목적은 Mono / Flux 의 각 파이프라인 단계를 검증하는 것임.
// 테스트를 위해 블로킹 하면 안된다.
val result = mono.block() // 블로킹 - WebFlux 환경에서 위험
assertThat(result).isEqualTo("hello")
// 그렇다고 subscribe로 검증하면 테스트가 끝나버린다.
mono.subscribe { result ->
assertThat(result).isEqualTo("hello")
// 비동기라 assert 실패해도 테스트가 통과될 수 있음
}
// StepVerifier - 파이프라인을 단계별로 안전하게 검증. 이게 필요하다.
StepVerifier.create(mono)
.expectNext("hello")
.verifyComplete()
// Mono 검증
StepVerifier.create(Mono.just("hello"))
.expectNext("hello") // 값 검증
.verifyComplete() // 완료 검증 (이걸 호출해야 실제 실행됨)
// Flux 검증
StepVerifier.create(Flux.just(1, 2, 3))
.expectNext(1)
.expectNext(2)
.expectNext(3)
.verifyComplete()
// 한번에 여러 값
StepVerifier.create(Flux.just(1, 2, 3))
.expectNext(1, 2, 3)
.verifyComplete()
참고로 시간도 제어할 수 있다. 실제로 전부 다 기다릴 필요 없음.
// 실제 시간을 기다리지 않고 가상 시간으로 테스트
StepVerifier.withVirtualTime {
Flux.interval(Duration.ofHours(1)).take(3)
}
.expectSubscription()
.thenAwait(Duration.ofHours(3)) // 가상으로 3시간 흘림
.expectNextCount(3)
.verifyComplete()
// 실제로 3시간 기다리지 않음