상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - JUnit에서 Mock 객체를 사용하는 방법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
JUnit에서 Mock 객체를 사용하는 방법에 대해 자세히 설명해 드리겠습니다. Mock 객체는 실제 객체를 대체하여 테스트할 때 의존성이나 외부 시스템에 의존하지 않고도 특정 동작을 시뮬레이션할 수 있게 해줍니다. JUnit 자체에는 Mock 기능이 포함되어 있지 않아서 일반적으로 Mockito, EasyMock, JMock 같은 mocking 프레임워크와 함께 사용합니다. 가장 널리 쓰이는 Mockito를 기준으로 설명하겠습니다. --- 1. Mockito 라이브러리 추가 먼저, 프로젝트에 Mockito 라이브러리를 포함해야 합니다. Gradle, <a href='https://sangseek.com/sangseeks/Maven/ko'>Maven</a> 등 빌드 도구에 따라 의존성을 추가합니다. 예를 들어, Gradle 기준: ```gradle <a href='https://sangseek.com/sangseeks/testImplementation/ko'>testImplementation</a> 'org.mockito:mockito-core:4.+' // 최신 버전을 확인해서 적용 ``` --- 2. 기본적인 Mock 객체 생성 Mockito를 사용해서 가장 간단하게 Mock 객체를 만드는 방법입니다. ```java import static org.mockito.Mockito.mock; public class MyServiceTest { @Test public void testWithMock() { MyRepository mockRepository = mock(MyRepository.class); // 이제 mockRepository는 MyRepository 인터페이스(혹은 클래스)의 Mock 객체입니다. } } ``` 이렇게 만든 mock 객체는 실제 객체처럼 메서드를 호출할 수 있지만, 기본적으로 아무 동작도 하지 않고 null이나 기본값을 리턴합니다. --- 3. Mock 객체에 동작 정의하기 (Stubbing) Mock 객체는 기본 동작이 없으므로, 특정 메서드가 호출됐을 때 원하는 값을 반환하도록 정의할 수 있습니다. 이를 Stubbing이라고 합니다. ```java import static org.mockito.Mockito.when; @Test public void testStub() { MyRepository mockRepository = mock(MyRepository.class); when(mockRepository.findById(1L)).thenReturn(new User(1L, "Alice")); User user = mockRepository.findById(1L); assertEquals("Alice", user.getName()); } ``` `when(...).thenReturn(...)` 구문을 통해 특정 입력값에 대해 결과를 미리 정의해 둘 수 있습니다. --- 4. Mock 객체를 JUnit 테스트에 주입하기 Mock 객체를 직접 만들고 주입해도 되지만, Mockito의 어노테이션을 이용하면 더욱 편리합니다. ```java import org.mockito.Mock; import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(MockitoExtension.class) public class MyServiceTest { @Mock private MyRepository myRepository; // 자동으로 Mock 객체 생성 @InjectMocks private MyService myService; // myRepository가 주입된 MyService 객체 생성 @Test public void testService() { when(myRepository.findById(1L)).thenReturn(new User(1L, "Bob")); User user = myService.getUserById(1L); assertEquals("Bob", user.getName()); } } ``` - `@Mock`은 Mock 객체를 자동으로 생성. - `@InjectMocks`는 Mock 객체를 의존성으로 주입하여 실제 테스트 대상 객체를 생성. - `@ExtendWith(MockitoExtension.class)`는 Mockito 어노테이션을 활성화. --- 5. Mock 객체의 호출 검증 (Verification) 단순히 반환값을 정의하는 것 외에, 특정 메서드가 호출됐는지 검증할 수 있습니다. ```java import static org.mockito.Mockito.verify; @Test public void testVerification() { MyRepository mockRepository = mock(MyRepository.class); MyService myService = new MyService(mockRepository); myService.getUserById(1L); verify(mockRepository).findById(1L); // findById(1L) 호출 여부 검증 } ``` 이렇게 하면 테스트 실패 시 메서드가 호출되지 않은 경우 알람을 받을 수 있습니다. --- 6. 예외 <a href='https://sangseek.com/sangseeks/던지기/ko'>던지기</a>, 특정 횟수 호출 등 고급 기능 - 특정 메서드가 호출되면 예외를 던지도록 만들 수도 있습니다. ```java when(mockRepository.findById(2L)).thenThrow(new RuntimeException("Not found")); ``` - 메서드 호출 횟수 검증: ```java verify(mockRepository, times(2)).findById(1L); ``` - 호출되지 않음을 검증할 수도 있습니다. ```java verify(mockRepository, never()).delete(any()); ``` --- 7. 전체적인 흐름 요약 1. Mockito 라이브러리를 프로젝트에 추가한다. 2. `mock()` 메서드나 `@Mock` 어노테이션으로 Mock 객체를 생성한다. 3. `when(...).thenReturn(...)` 형태로 Mock 객체의 동작을 정의한다. 4. 실제 테스트 대상에 Mock 객체를 주입(`@InjectMocks` 활용 가능). 5. 테스트 수행 후 `verify()`를 통해 Mock 객체의 메서드 호출을 검증한다. --- 마무리 - Mock 객체는 외부 의존성을 격리하여 단위 테스트를 용이하게 만든다. - Mockito는 JUnit과 함께 사용할 때 직관적이고 풍부한 기능을 제공한다. - 적절한 Mock 사용은 테스트 코드의 안정성과 유지보수성을 크게 높여준다. 이상으로 JUnit에서 Mock 객체를 사용하는 방법에 대해 Mockito를 중심으로 자세히 설명해 드렸습니다. 추가 질문이 있으시면 언제든지 말씀해 주세요.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기