[Java] 리액티브 프로그래밍 StepVerifier
StepVerifier란?
StepVerifier는 Reactive Streams API를 사용하는 테스트를 위한 유틸리티 클래스입니다. Mono, Flux와 같은 Reactive Publisher를 테스트하는데 사용됩니다.
주요 기능
- 데이터 검증: 예상되는 데이터와 실제 발행되는 데이터를 비교
- 에러 검증: 예상되는 에러가 발생하는지 검증
- 완료 검증: Publisher가 완료되었는지 검증
- 시퀀스 조작: 데이터 발행 순서를 조작하거나 특정 데이터를 건너뛸 수 있습니다.
- 백프레셔 시뮬레이션: 백프레셔 상황을 시뮬레이션하여 테스트를 수행합니다.
백프레셔란 Publisher에서 생산되는 데이터들의 양이 Subscriber에서 처리가능한 양보다 많을때 Subscriber에서 지연 현상이 발생하지 않도록 Publisher에서 데이터 생산량을 조절하는 개념입니다.
StepVerifier 사용 하기
StepVerifier를 사용하기 위해서는 StepVerifier.create 메소드를 사용하여 Publisher를 생성하고, expectNext, expectError, expectComplete 등의 메소드를 사용하여 Publisher가 발행하는 데이터를 검증합니다.
expectComplete 메소드
@Test
void testStepVerifier() {
StepVerifier.create(Flux.just(1, 2, 3, 4, 5))
.expectNext(1, 2, 3, 4, 5)
.expectComplete()
.verify();
}
expectComplete
메소드는 Publisher가 완료되었는지 검증합니다. 위의 코드는 Flux.just(1, 2, 3, 4, 5)를 생성하여 StepVerifier를 통해 데이터를 검증하는 예제입니다.
expectNext 메소드를 통해 발행되는 데이터를 검증하고, expectComplete 메소드를 통해 Publisher가 완료되었는지 검증합니다.
expectError 메소드
@Test
void testStepVerifierError() {
StepVerifier.create(Flux.error(new RuntimeException("Error!")))
.expectError(RuntimeException.class)
.verify();
}
expectError
메소드는 Publisher가 에러를 발생시켰는지 검증합니다. 일치하지 않으면 에러가 발생합니다.
expectNextCount 메소드
@Test
void testStepVerifierNextCount() {
StepVerifier.create(Flux.just(1, 2, 3, 4, 5))
.expectNextCount(5)
.expectComplete()
.verify();
}
expectNextCount
메소드는 발행되는 데이터의 개수를 검증합니다.
expectNextMatches 메소드
@Test
void testStepVerifierNextMatches() {
StepVerifier.create(Flux.just(1, 2, 3, 4, 5))
.expectNextMatches(i -> i == 1)
.expectNextMatches(i -> i == 2)
.expectNextMatches(i -> i == 3)
.expectNextMatches(i -> i == 4)
.expectNextMatches(i -> i == 5)
.expectComplete()
.verify();
}
expectNextMatches
메소드는 expectNext 메소드와 비슷하지만, Predicate를 사용하여 발행되는 데이터가 조건에 맞는지 검증합니다.
expectNoEvent 메소드
@Test
void testStepVerifierNoEvent() {
StepVerifier.create(Flux.empty())
.expectNoEvent()
.expectComplete()
.verify();
}
expectNoEvent
메소드는 Publisher가 데이터를 발행하지 않는지 검증합니다. 데이터가 발행되면 에러가 발생합니다.
withVirtualTime, thenAwait 메소드
@Test
void testStepVerifierThanAwait() {
Supplier<Flux<Long>> supplier = () -> Flux.interval(Duration.ofSeconds(1)).take(3600);
StepVerifier.withVirtualTime(supplier)
.thenAwait(Duration.ofSeconds(3600))
.expectNextCount(3600)
.expectComplete()
.verify();
}
withVirtualTime
메소드는 가상 시간을 사용하여 테스트를 수행합니다. thenAwait
메소드는 Publisher가 완료되기 전에 지정된 시간만큼 대기합니다. 위의 코드는 1초주기로 3600개의 데이터를 발행하는 Flux를 생성하고, 3600초를 대기하여 Publisher가 완료되는지 검증하는 예제입니다.
실제 시간 경과를 기다릴 필요 없이 테스트를 빠르게 실행할 수 있고 테스트 코드에서 시간 경과를 직접 제어하여 특정 시나리오를 쉽게 테스트할 수 있습니다.
'개발 언어 > Java' 카테고리의 다른 글
Java 8 Stream API 주요 메서드와 사용 예제 (0) | 2024.11.20 |
---|---|
Java 시간 클래스 차이 LocalDateTime OffsetDateTime (0) | 2024.11.14 |
Java 리액티브 Mono Flux 설명 예제 (0) | 2024.02.06 |
Java8 함수형 인터페이스 Function, Consumer, Predicate, Supplier (0) | 2023.11.15 |
Java8 Functional Interface 간단한 예제로 알아보기 (0) | 2023.06.04 |
댓글