1. @Mock
- 역할: 실제 객체의 **모의 객체(Mock Object)**를 생성합니다. 모의 객체는 실제 동작을 하지 않고, 정의한 대로 동작하도록 설정할 수 있습니다.
- 사용 목적: 외부 의존성을 실제로 동작하지 않게 하고, 테스트하고자 하는 클래스의 동작만 확인할 수 있도록 하기 위해 사용합니다.
- 예를 들어, 데이터베이스 호출이나 외부 서비스 호출을 모킹하여 테스트의 속도를 높이고, 외부 의존성 없이 순수하게 비즈니스 로직만을 테스트할 수 있습니다.
2. @InjectMocks
- 역할: @Mock으로 생성된 모의 객체를 해당 클래스의 의존성으로 주입합니다. 즉, 테스트할 클래스의 인스턴스를 생성하고, 이 클래스가 의존하는 다른 객체를 모킹된 객체로 자동으로 주입해줍니다.
- 사용 목적: 테스트하려는 클래스의 의존성(예: 서비스 클래스가 의존하는 리포지토리)을 모의 객체로 주입하여, 테스트 대상 클래스의 비즈니스 로직을 테스트할 때 사용합니다.
3. ArgumentCaptor<T> entityCaptor = forClass(Entity.class);
verify(검증하려는 객체, times(n)).method(entityCaptor.capture());
ArgumentCaptor<Menu> menuCaptor = forClass(Menu.class);
verify(menuRepository, times(1)).save(menuCaptor.capture());
- ArgumentCaptor는 Mockito에서 제공하는 기능으로, 메서드 호출 시 전달된 인자(객체)를 캡처하여 이를 나중에 검증할 수 있도록 해준다.
- 즉, menuRepository.save() 메서드가 호출될 때 전달된 Menu 객체를 캡처해서, 그 객체의 상태(필드값)를 테스트에서 검증할 수 있다.
- 여기서 forClass(Menu.class)는 Menu 클래스 타입의 인자를 캡처하기 위해 ArgumentCaptor를 생성하는 것이다.
- verify는 Mockito에서 특정 메서드가 지정된 조건에 맞게 호출되었는지를 검증하는 기능이다.
- 이 예시에서는 menuRepository.save()가 정확히 n번 호출되었는지 확인한다.
- times(1)은 save 메서드가 한 번 호출되었음을 의미하며, 여러 번 호출되거나 호출되지 않았으면 테스트는 실패하게 된다.
- menuCaptor.capture(): capture()는 ArgumentCaptor가 지정된 메서드의 인자를 캡처하는 메서드, verify가 menuRepository.save()가 호출되었는지 확인하면서, save() 메서드에 전달된 Menu 객체를 캡처
4. ReflectionTestUtils.setField(object, fieldName, value);
- object: 필드를 설정할 대상 객체
- fieldName: 설정할 필드의 이름입니다. 문자열로 제공
- value: 해당 필드에 설정할 값
5. @ExtendWith(SpringExtension.class)
- 테스트 컨텍스트 관리: Spring이 관리하는 빈과 관련된 설정을 자동으로 처리
- 의존성 주입: 테스트 클래스 내에서 Spring의 빈을 손쉽게 주입받아 사용 가능
- 트랜잭션 관리: Spring의 트랜잭션 관리 기능을 사용할 수 있어, 데이터베이스 관련 테스트에서 유용
'Java & Spring > Spring' 카테고리의 다른 글
JPA - 쿼리 파일 만들기 (1) | 2024.09.27 |
---|---|
JPA - 데이터베이스와 SQL (3) | 2024.09.26 |
47일차 - Controller 테스트 (0) | 2024.09.11 |
46일차 - 테스트 코드 애노테이션 (2) | 2024.09.10 |
JWT 구현 및 사용 (0) | 2024.09.09 |