👩💻 Mockito
📌 Mockito
✏️ Mockito란?
:단위 테스트를 위해 모의 객체를 생성하고 관리하는 자바 오픈소스 프레임워크
실제 객체의 동작을 모방하는 "모의 객체"를 생성하여 코드의 특정 부분을 "격리"시키고, 테스트를 편리하게 할 수 있도록 도와준다.
💡 모의객체
: 실제 객체의 생성을 대체하여 테스트 코드에 사용되는 객체
📌 JUnit & JUnit + Mockito 비교
✏️ Mockito를 사용하지 않고 JUnit만을 이용해서 테스트 코드를 작성한다면
:JUnit Test

그림은 Mockito를 사용하지 않고 JUnit5만을 사용하여서 서비스를 테스트한 테스트 케이스의 흐름을 보여준다.
- @Test를 수행하는 testsIsNotNullCodeList()라는 메서드에서는 서비스 호출을 위해 ‘Local Server’를 실행시켜서
DB 데이터를 조회한다.
- 매번 데이터 조회를 해오기 위해 ‘로컬 서버’를 실행시켜 테스트를 수행하는 데에 불편함이 발생한다.
➡️ 이 불편함을 해소하고자 "Mockito"를 사용함
✏️ JUnit + Mockito를 통해 테스트 코드 작성
:JUnit Test + Mockito

- 그림은 Mockito를 사용하여 서비스를 테스트한 테스트 케이스의 흐름을 보여준다.
- @Test를 수행하는 TestMethod()라는 메서드에서 서비스 호출을 위해 getCodeList() 함수를 호출하지만 DB에서 데이터를 조회해오지 않는다.
➡️ 이 과정에서는 JUnit5만을 이용하였던 방식과 다르게 직접적인 DB 호출을 수행하지 않고 Mock Object라는 모의 객체를 구성하여서 테스트를 진행하는 방식이다.
📌 Stub & Spy & 검증
✏️ Stub
: 예상 동작 설정 기능
테스트 중에 모의 객체(Mock Object)의 "예상 동작"을 설정하는 기능
- 이를 사용하여 메소드가 호출될 때 어떤 값을 반환하거나 어떤 예외를 던져야 하는지 지정
- 이를 통해 종속성의 동작을 제어하고 테스트 대상을 격리할 수 있다
// Mock 객체 생성
List<String> mockList = Mockito.mock(List.class);
// Mock 객체의 동작 정의 : Stub - Mock 객체의 사이즈를 항상 10으로 반환하도록 예상동작을 설정합니다.
Mockito.when(mockList.size()).thenReturn(10);
// Mock 객체의 메소드 호출
int size = mockList.size();
// 결과 확인
assertEquals(10, size);
✏️ Spy
: 실제 객체 생성 - 기존 객체의 일부 메서드를 원본 동작을 유지하면서 변경하거나 감시할 수 있게 해주는 기능
Spy를 사용하면 실제 객체를 생성하고 원하는 메서드를 호출할 수 있다.
- 이는 테스트 동작에 객체의 일부 동작을 감시하고, 특정 메서드 호출을 확인하거나 원하는 대로 메서드의 반환 값을 변경할 수 있는 유연성을 제공한다.
✏️ 검증(Verification)
: 검증 - 모의 객체의 메서드 호출을 확인하는 프로세스
Verification을 사용하여 특정 메서드가 예상대로 호출되었는지 확인 가능
// 예시 클래스
public class ExampleClass {
public void methodA() {
// 동작 A
}
public void methodB() {
// 동작 B
}
}
// Mockito를 사용한 Verification 예시
ExampleClass mockExample = Mockito.mock(ExampleClass.class);
// 메소드 호출
mockExample.methodA();
mockExample.methodB();
// 메소드 호출 확인
Mockito.verify(mockExample).methodA();
Mockito.verify(mockExample).methodB();
// 메소드 호출 순서 확인
InOrder inOrder = Mockito.inOrder(mockExample);
inOrder.verify(mockExample).methodA();
inOrder.verify(mockExample).methodB();
📌 Mockito 어노테이션
✏️ Mockito에서 제공하는 주요 어노테이션
| Annotatin | 설명 |
| @Mock | - 모의 객체(Mock Object)를 생성 |
| @Spy | - 스파이 객체(Spy Object)를 생성 |
| @Captor | - 모의 객체에 전달된 메서드 인수를 캡쳐 |
| @InjectMocks | - 테스트 대상이 되는 객체에 모의 객체를 자동으로 주입할 때 사용 |
| @MockBean | - 스프링 프레임워크에서 사용되며, 테스트용 Mock 객체를 생성하고 주입 |
| @MockitoSettings | - Mockito의 설정 변경 및 커스터마이징 |
| @Mockito JUnitRunner | - JUit 테스트에서 Mockito를 사용하기 위해 실행할 때 사용 |
💡@InjectMocks, @Mock, @MockBean 차이점
: @InjectMocks, @Mock은 Mockito에서 "유닛 테스트"에 사용되고, @MockBean은 Spring Boot에서 "통합 테스트"에서 사용된다.
- @Mock은 특정 클래스나, 인터페이스에 대한 "모의 객체를 생성"하는 역할을 수행
- @InjectMocks는 테스트 대상 객체에 "모의 객체를 주입"하는 역할을 수행
💡모의 객체를 생성하는 것과 모의 객체를 주입한다의 차이는 무엇인가
- @Mock와 같이 ‘모의 객체를 생성’한다는 것은 실제 객체와 동일한 메서드와 동작을 가지지만 실제 데이터나 외부 리소스와의 상호작용은 없다.
- @InjectMocks와 같이 ‘모의 객체를 주입’하는다는 것은 테스트의 대상이 특정 모의 객체를 사용해야 할 때, 그 모의 객체를 자동으로 주입하여 테스트를 수행할 수 있도록 한다.
- 모의 객체를 주입하는 것은 @Mock로 생성한 모의 객체가 자동으로 주입되어 테스트가 진행된다.
참고자료
https://adjh54.tistory.com/342
https://adjh54.tistory.com/346
'Spring' 카테고리의 다른 글
| [Spring Security] Security 기본 (0) | 2024.08.29 |
|---|---|
| [Spring] 컨트롤러 예외처리(Exception Handling) (0) | 2024.07.21 |
| [Spring] 연관관계 매핑 (0) | 2024.06.30 |
| [Spring] Jsoup를 사용한 html 파싱 (0) | 2024.06.17 |
| [Spring]강의 들으며 헷갈리는 Spring 개념 정리 (0) | 2024.03.04 |
