반응형
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 |