본문 바로가기

BackEnd/spring

Webclient retry Test 방법

반응형

WebClient로 개발시 retry를 테스트 해보려 할경우 실제 RestApi로 직접 연결시 테스트 하기가 쉽지 않다
그래서 MockServer 이용한 테스트 방법을 정리 해본다.

gradle dependency 추가

testImplementation group: 'com.squareup.okhttp3', name: 'mockwebserver', version: '4.0.1'
testImplementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.0.1'
testImplementation group: 'io.projectreactor', name: 'reactor-test', version: '3.4.6'

Retry 테스트 코드 추가

@Test
public void WebClient_retry_test() throws IOException {

    MockWebServer mockWebServer = new MockWebServer();

    String expectedResponse = "OK";
    mockWebServer.enqueue(new MockResponse().setResponseCode(429));
    mockWebServer.enqueue(new MockResponse().setResponseCode(429));
    mockWebServer.enqueue(new MockResponse().setResponseCode(429));
    mockWebServer.enqueue(new MockResponse().setResponseCode(200)
            .setBody(expectedResponse));

    mockWebServer.start();

    HttpUrl url = mockWebServer.url("/test/health-check");
    Mono<String> responseMono = 
		WebClient.builder()
        	.build().get().uri(url.uri()).retrieve().bodyToMono(String.class)
        	//.retry(3);
            .retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(2)));

    StepVerifier.create(responseMono)
            .expectNext(expectedResponse)
            .expectComplete().verify();

    mockWebServer.shutdown();

}

위의 테스트 코드를 돌리면 3번 실패후 4번째 성공을 하여 정상적으로 값을 가져오는것을 볼수 있다.

Block 테스트 코드

    @Test
    public void WebClient_retry_test() throws IOException {

        MockWebServer mockWebServer = new MockWebServer();

        String expectedResponse = "OK";
        mockWebServer.enqueue(new MockResponse().setResponseCode(200)
                .setBodyDelay(7000, TimeUnit.MILLISECONDS)
                .setBody(expectedResponse)
        );
        mockWebServer.start();

        HttpUrl url = mockWebServer.url("/test/health-check");
        Mono<String> responseMono = coopMktClient.SendTest(url.uri());
        // Wait Test
        String result = responseMono.block(Duration.ofSeconds(3L));
        mockWebServer.shutdown();

    }

7초 대기 mobWebServer 구성하고
WebClient에서 block로 3초 하였을경우 아래와 같은 오류 발생을 확인할수 있다.

java.lang.IllegalStateException: Timeout on blocking read for 3000000000 NANOSECONDS
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:123)
at reactor.core.publisher.Mono.block(Mono.java:1727)

반응형

'BackEnd > spring' 카테고리의 다른 글

layer dockerfile  (0) 2021.06.28
Springboot dockerfile 없이 이미지 생성하기 bootBuildImage  (0) 2021.06.28
WebClient Multi Mono -> Flux  (0) 2021.05.23
xss Filter emoji parse error  (1) 2021.03.02
git 디렉토리 삭제 하고 싶을때  (0) 2021.02.18