본문 바로가기

Test Code

WebClient 사용 코드에서 단위 테스트 작성하기 - MockWebServer

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