[WebClient] @RestClientTest를 WebFlux에서 사용하기
2020. 7. 11. 18:58ㆍJava
RestTemplate
을 사용하는 스프링 프로젝트에서는 외부 api를 mocking해서 테스트 할 때, 주로 @RestClientTest
를 사용했다. 이에 관해서는 굉장히 좋은 글이 있으니 참고하면 좋을 것 같다.
문제
RestTemplate
을 사용하지 않고 @RestClientTest
를 쓰는 경우 아래와 같은 에러를 마주하게 된다.
스프링 진영에서는 @RestClientTest
가 Webclient
를 지원할 계획이 없다고 선언했다. 따라서 WebClient
를 쓰는 경우 @RestClientTest
를 사용하지 못한다.
하지만 대안으로 MockWebServer
를 사용하라고 추천하고 있다.
해결
MockWebServer
를 사용하면 @RestClientTest
와 동일하게 서버를 mocking할 수 있다.
class WebClientTest {
private MockWebServer server;
private WebClient webClient;
@BeforeEach
void setUp() {
ReactorClientHttpConnector connector = new ReactorClientHttpConnector();
server = new MockWebServer();
webClient = WebClient
.builder()
.clientConnector(connector)
.baseUrl(server.url("/").toString())
.build();
}
@AfterEach
void shutdown() throws IOException {
server.shutdown();
}
@DisplayName("Get 요청을 보낸 뒤, ResponseDto 를 응답")
@Test
void getRetrieveResponse() throws IOException {
MockResponse mockResponse = new MockResponse()
.addHeader("Authorization", "someTokenValue")
.addHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE)
.setResponseCode(HttpStatus.OK.value())
.setBody("This is Response Body");
server.enqueue(mockResponse);
Mono<String> responseBody = webClient
.get()
.uri(GET_URL)
.header("Authorization", "someTokenValue")
.retrieve()
.bodyToMono(String.class);
StepVerifier.create(responseBody)
.consumeNextWith(body -> assertThat(body).isEqualTo("This is Response Body"))
.expectNextCount(0)
.expectComplete()
.verify();
}
}
MockWebServer
객체를 생성하고, MockResponse
를 필요한 만큼 생성해서 서버의 큐에 싣는 방식이다.WebClient
의 테스트 전략에 대한 설명은 여기서 자세히 확인할 수 있다.
'Java' 카테고리의 다른 글
[Jackson] Jackson 파싱 전략(불변 객체 활용) (1) | 2020.07.12 |
---|---|
[Spring Data JDBC] 라이프사이클 이벤트와 콜백(LifeCycle Events & Callback) (1) | 2020.07.11 |
[Spring Data JDBC] Id 삽입 전략 (0) | 2020.07.03 |
[Spring Data JDBC] 객체(Object)와 개체(Entity) 대응시키기 (0) | 2020.05.11 |
JPA vs JDBC, JPA vs Mybatis, JPA vs Spring Data JPA의 차이점과 Hibernate (0) | 2020.04.25 |