1. 개요
Tripot 프로젝트에서 축제 데이터를 저장하고 해당 서비스 계층의 단위 테스트를 작성하려 한다. 단위 테스트는 서비스 계층만이 의도대로 동작하는 지 확인해야 하므로 WebFlux 등 다른 클래스의 동작은 정상적으로 동작한다고 가정해야 한다. 이를 위해 MockWebServer를 사용하여 테스트코드를 작성해보고자 한다.
2. build.gradle
API 모듈에 다음의 의존성을 추가해주었다.
//mock web server
implementation 'com.squareup.okhttp3:mockwebserver:5.0.0-alpha.14'
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.14'
3. MockWebServer
@BeforeEach
void init() throws IOException {
objectMapper = new ObjectMapper();
mockWebServer = new MockWebServer();
mockWebServer.start();
String baseUrl = String.format("localhost:%s", mockWebServer.getPort());
String key = "sample_api_key";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();
factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
WebClient webClient = WebClient.builder()
.baseUrl(baseUrl)
.uriBuilderFactory(factory)
.build();
// 조작된 WebClient 주입
festivalService = new FestivalService(webClient, festivalRepository, baseUrl, key);
}
@AfterEach
void tearDown() throws IOException {
mockWebServer.shutdown();
}
실제 TourAPI가 아닌 MockWebServer에 접속해야 하고 현재 서비스에서는 @Value를 이용하여 주입받는데, Mock 단위 테스트에서는 이를 주입받는 데 어려움이 있으므로 웹서버의 baseUrl과 가짜 액세스 키를 기반으로 FestivalService에 넣어주었다.
mockWebServer.start()를 하게 되면 내부에서 랜덤 포트 번호를 가지고 작은 가짜 서버를 실행시킨다. 이에 url은 로컬호스트의 포트 번호를 붙여 설정한다.
@Test
@DisplayName("축제 저장 - 축제 저장 로직이 정상적으로 동작해야 함")
void saveFestival() throws JsonProcessingException {
//given
//응답 객체 생성
...
//webClient 요청 시 받게 될 가짜 응답을 미리 설정
mockWebServer.enqueue(new MockResponse()
.addHeader("Content-Type", "application/json")
.setResponseCode(200)
.setBody(
objectMapper.writeValueAsString(festivalApiResponse)
));
//when
festivalService.saveFestival("20250101", "");
실제 테스트 코드 중 일부이다. 가짜 서버이므로 받게 될 응답은 미리 만들어 넣어주어야 한다. 이제 saveFestival 로직에서 요청되는 첫 번째 요청은 festivalApiResponse를 body로 갖는 응답을 받을 수 있다.
로직이 정상적으로 동작하는 것을 확인할 수 있었다.
'Test Code' 카테고리의 다른 글
Intellij - 테스트 커버리지 확인하기 (0) | 2025.02.05 |
---|