Tech.io의 'Reactive Programming with Reactor 3'을 공부하면서 정리하는 글입니다.
StepVerifier
- Reactor-test 프로젝트에 속함
- Publisher 를 구독하면서 예상값과 순서를 검증(Assert)할 수 있음
- 검증이 실패할 경우, AssertionError 를 발생
create
메서드로 인스턴스를 생성- 반드시
verify()
메서드(=StepVerifier.LastStep)를 호출해야 함 - 보통 다음과 같은 형태임
StepVerifier.create(T<Publisher>) .{expectations...} .verify()
- expectations 의 종류
연습
// TODO Use StepVerifier to check that the flux parameter emits "foo" and "bar" elements then completes successfully.
void expectFooBarComplete(Flux<String> flux) {
StepVerifier.create(flux)
.expectNext("foo")
.expectNext("bar")
.verifyComplete();
}
// TODO Use StepVerifier to check that the flux parameter emits "foo" and "bar" elements then a RuntimeException error.
void expectFooBarError(Flux<String> flux) {
StepVerifier.create(flux)
.expectNext("foo")
.expectNext("bar")
.expectError(RuntimeException.class);
}
// TODO Use StepVerifier to check that the flux parameter emits a User with "swhite"username
// and another one with "jpinkman" then completes successfully.
void expectSkylerJesseComplete(Flux<User> flux) {
StepVerifier.create(flux)
.assertNext(u -> assertThat(u.getUsername()).isEqualTo("swhite"))
.assertNext(u -> assertThat(u.getUsername()).isEqualTo("jpinkman"))
.verifyComplete();
}
// TODO Expect 10 elements then complete and notice how long the test takes.
void expect10Elements(Flux<Long> flux) {
StepVerifier.create(flux)
.expectNextCount(10)
.verifyComplete();
}
// TODO Expect 3600 elements at intervals of 1 second, and verify quicker than 3600s
// by manipulating virtual time thanks to StepVerifier#withVirtualTime, notice how long the test takes
void expect3600Elements(Supplier<Flux<Long>> supplier) {
StepVerifier.withVirtualTime(supplier)
.thenAwait(Duration.ofSeconds(3600)) // 3,600 초가 지났다고 간주함
.expectNextCount(3600)
.verifyComplete();
}
StepVerifier.withVirtualTime(Supplier<Publisher>)
을 사용하면, 조작할 수 있는 시계가 탑재된VirtualTimeScheduler
에 의해 코드가 실행됨
또 다른 예
StepVerifier.withVirtualTime(() -> Mono.delay(Duration.ofHours(3)))
.expectSubscription()
.expectNoEvent(Duration.ofHours(2)) // 2 시간동안 이벤트가 없고,
.thenAwait(Duration.ofHours(1)) // 1 시간동안
.expectNextCount(1) // 1 번의 이벤트가 발생 한 뒤
.expectComplete() // 종료됨
.verify();
관련글
2021.03.02 - [learning] - Reactive Programming 소개 (1/12)
2021.03.02 - [learning] - Flux 인스턴스 생성하기 (2/12)
2021.03.09 - [learning] - Mono 만들기 (3/12)
(전 아직 못봤습니다만..) 백기선님의 동영상