상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - JUnit에서 외부 API를 mocking 하는 방법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
JUnit에서 외부 API를 mocking 하는 방법에 대해 설명드리겠습니다. 외부 API를 직접 호출하면 테스트가 느려지고 불안정해질 수 있기 때문에, 실제 호출을 막고 예상 응답을 반환하도록 mocking 하는 것이 일반적입니다. 대표적으로 사용하는 도구는 Mockito, WireMock, MockWebServer 등이 있으며, 상황에 따라 적합한 방법을 선택할 수 있습니다. 1. Mockito를 이용한 API 클라이언트 mocking - 개념 : 외부 API 호출을 담당하는 클라이언트(예: RestTemplate, WebClient, FeignClient)를 Mockito로 mocking 하여, 실제 네트워크 호출 없이 미리 정의한 응답을 반환하게 합니다. - 방법 : 1. 외부 API 호출 로직이 포함된 클래스나 메서드를 테스트 대상 클래스에 주입(injection)할 수 있어야 합니다. 2. 테스트 클래스에서 Mockito의 `@Mock` 또는 `Mockito.mock()`으로 API 호출 객체를 생성합니다. 3. `when(...).thenReturn(...)`으로 호출 결과를 미리 정의합니다. 4. 테스트 대상 클래스에 mock 객체를 주입해 외부 호출 대신 mocking 된 응답이 사용되도록 합니다. - 예 : ```java @ExtendWith(MockitoExtension.class) public class MyServiceTest { @Mock private RestTemplate restTemplate; @InjectMocks private MyService myService; // 실제로 외부 API 호출하는 서비스 @Test public void testExternalApiCall() { String url = "http://external.api/resource"; ResponseEntity<String> mockResponse = new ResponseEntity<>("mocked response", HttpStatus.OK); when(restTemplate.getForEntity(url, String.class)).thenReturn(mockResponse); String result = myService.callExternalApi(); assertEquals("mocked response", result); } } ``` - 장점 : 코드 레벨에서 세밀한 동작 제어 가능, 별도의 서버가 필요 없음. - 단점 : 외부 API의 HTTP 레벨 동작(헤더, 바디, 실제 요청 등)은 검증 어려움. --- 2. WireMock을 이용한 HTTP 서버 mocking - 개념 : WireMock은 로컬에 가벼운 HTTP 서버(mock server)를 띄워서, 외부 API의 HTTP 요청을 받고 미리 설정한 응답을 반환하도록 설정할 수 있습니다. - 방법 : 1. WireMock을 테스트에 포함시키고 테스트 시작 시 mock 서버를 실행합니다. 2. WireMock API를 사용해 특정 HTTP 요청에 대한 예상 응답을 설정합니다. 3. 외부 API 호출이 실제 WireMock 서버 주소로 향하게 설정합니다. 4. 테스트 종료 시 mock 서버를 중지합니다. - 예 : ```java @ExtendWith(WireMockExtension.class) public class MyServiceTest { @RegisterExtension static WireMockExtension wireMock = WireMockExtension.newInstance() .options(options().port(8089)) .build(); @InjectMocks private MyService myService; // 외부 API endpoint를 localhost:8089로 설정했다고 가정 @Test public void testApiCall() { wireMock.stubFor(get(urlEqualTo("/resource")) .willReturn(aResponse() .withStatus(200) .withBody("mocked response"))); String result = myService.callExternalApi(); assertEquals("mocked response", result); } } ``` - 장점 : 실제 HTTP 통신을 테스트할 수 있어 API의 REST 스펙 검증에 유리. - 단점 : 테스트 환경 구축이 복잡할 수 있고, 테스트 속도가 약간 느릴 수 있음. --- 3. MockWebServer (OkHttp) 활용 - 개념 : MockWebServer는 OkHttp에서 제공하는 HTTP mock 서버로, WireMock보다 가볍고 테스트 내 단기간 실행에 적합합니다. - 방법 : 1. 테스트 내에서 MockWebServer를 시작합니다. 2. API 응답을 enqueue하여 사전 정의합니다. 3. 테스트 대상 클래스가 MockWebServer 주소로 호출하도록 설정합니다. 4. 테스트 후 서버 종료. - 예 : ```java public class MyServiceTest { private MockWebServer mockWebServer; private MyService myService; @BeforeEach public void setup() throws IOException { mockWebServer = new MockWebServer(); mockWebServer.start(); String baseUrl = mockWebServer.url("/").toString(); myService = new MyService(baseUrl); } @AfterEach public void tearDown() throws IOException { mockWebServer.shutdown(); } @Test public void testApiCall() throws InterruptedException { mockWebServer.enqueue(new MockResponse() .setResponseCode(200) .setBody("mocked response")); String result = myService.callExternalApi(); assertEquals("mocked response", result); RecordedRequest request = mockWebServer.takeRequest(); assertEquals("/resource", request.getPath()); } } ``` - 장점 : 매우 경량, 네트워크 통신 흐름 및 요청 검증 가능. - 단점 : OkHttp 기반 통신에 좀 더 적합. --- 정리 - Mockito : 코드 레벨에서 간단히 외부 API 호출 모킹. 네트워크 동작 검증 필요 없을 때 적합. - WireMock : 복잡한 HTTP 상호작용을 통합 테스트로 검증할 때 적합, 실제 서버를 띄움. - MockWebServer : 가벼운 HTTP mock 서버, OkHttp 기반 호출에 적합. 상황과 요구사항에 따라 적합한 방식을 선택해 JUnit 테스트 환경 내에서 외부 API 호출을 안정적으로 mocking 하실 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기