본문 바로가기
개발 언어/Java

Java 리액티브 StepVerifier 설명 예제

by 정권이 내 2024. 2. 20.

[Java] 리액티브 프로그래밍 StepVerifier

 

StepVerifier란?

StepVerifier는 Reactive Streams API를 사용하는 테스트를 위한 유틸리티 클래스입니다. Mono, Flux와 같은 Reactive Publisher를 테스트하는데 사용됩니다.

Java 리액티브 Mono & Flux 참고글

 

주요 기능

  • 데이터 검증: 예상되는 데이터와 실제 발행되는 데이터를 비교
  • 에러 검증: 예상되는 에러가 발생하는지 검증
  • 완료 검증: 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가 완료되는지 검증하는 예제입니다.

실제 시간 경과를 기다릴 필요 없이 테스트를 빠르게 실행할 수 있고 테스트 코드에서 시간 경과를 직접 제어하여 특정 시나리오를 쉽게 테스트할 수 있습니다.

 

 

반응형

댓글