MockWebServer를 사용해 외부 API 호출하는 테스트 코드 작성하기

작성일

MockWebServer란?

MockWebServer외부 API를 호출하는 코드의 테스트 코드를 작성할 때 사용한다.

HTTP Request를 받아서 Response를 반환하는 간단하고 작은 웹 서버이다.

WebClient를 사용하여, HTTP를 호출하는 메서드의 테스트 코드를 작성할 때 이 MockWebServer를 호출하여 테스트 코드를 쉽게 작성할 수 있다.

MockWebServer 사용하기

build.gradle 추가

testImplementation('com.squareup.okhttp3:okhttp:4.10.0')
testImplementation('com.squareup.okhttp3:mockwebserver:4.10.0')

예제 코드

@Slf4j
@Service
public class KakaoUriBuilderService {

    private static final String KAKAO_LOCAL_SEARCH_ADDRESS_URL = "https://dapi.kakao.com/v2/local/search/address.json";

    public URI buildUriByAddressSearch(String address) {
        UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(KAKAO_LOCAL_SEARCH_ADDRESS_URL);
        uriBuilder.queryParam("query", address);

        URI uri = uriBuilder.build().encode().toUri();
        log.info("[KakaoUriBuilderService buildUriByAddressSearch] address: {}, uri: {}", address, uri);

        return uri;
    }
}
  • KakaoUriBuilderService 클래스에서 외부 API를 호출한다.
class KakaoAddressSearchServiceRetryTest extends AbstractIntegrationContainerBaseTest {

    @SpringBean
    private KakaoUriBuilderService kakaoUriBuilderService = Mock()

    private MockWebServer mockWebServer

    def setup() {
        mockWebServer = new MockWebServer()
        mockWebServer.start()
        println mockWebServer.port
        println mockWebServer.url("/")
    }

    def cleanup() {
        mockWebServer.shutdown()
    }

    def "requestAddressSearch retry success"() {
        given:
        ...
        def uri = mockWebServer.url("/").uri()

        when:
        mockWebServer.enqueue(new MockResponse().setResponseCode(504))
        mockWebServer.enqueue(new MockResponse().setResponseCode(200)
                .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .setBody(mapper.writeValueAsString(expectedResponse)))

        ...
    }
}
  • KakaoUriBuilderService에서 외부 API를 호출하기 때문에 Mock으로 등록했다.
  • @SpringBean을 붙여 스프링 컨테이너가 해당 빈을 주입받는다.
  • setup() 메서드에서 MockWebServer를 사용하기 위해 셋팅을 한다. 여기서 포트는 임의의 포트를 받는다.
  • cleanup() 메서드에선 MockWebServer 종료한다.
  • when 블럭에 작성한 코드를 살펴보자.
    • enqueue에 응답 코드와 헤더, 바디를 작성하면 작성한 순서대로 응답을 받게 된다.

Github 코드