EntityFetcher 클래스의 메서드들이 예외를 잘 던지는지 테스트하는 것
특히 DB에 값이 없을 때, CustomException이 발생하는지 확인하고 있다
import 문들AssertJ:
assertThatThrownBy() 같은 걸 쓰려고 불러온 것 (가독성 좋은 테스트용 라이브러리)
Mockito:
mock(), when() 같은 걸 써서 가짜 객체(Mock)를 만들고 조작하려고.
JUnit5:
@Test, @ExtendWith 쓰려고. (JUnit5 버전이 맞다)
프로젝트 소스들:
EntityFetcher, CustomException 이런 내가 만든 클래스들도 불러온 것
@ExtendWith(MockitoExtension.class)이 테스트 클래스(EntityFetcherTest)는 Mockito 기능을 확장해서 쓸 거다 선언하는 것
그래야 @Mock, @InjectMocks 같은 게 작동한다
@Mock
private UserRepository userRepository;
@Mock
private StoreRepository storeRepository;
@InjectMocks
private EntityFetcher entityFetcher;
@Mock:
→ 진짜 DB에 접근하는 게 아니라, 가짜 UserRepository, StoreRepository를 만들어서 쓸 거야
@InjectMocks:
→ Mockito가 EntityFetcher를 만들면서, 위에서 만든 Mock 객체들을 자동으로 주입(inject) 해줘
즉, 진짜 DB 없이도 EntityFetcher를 테스트할 수 있다
일치하는_주문id_없으면_CustomException()@Test
void 일치하는_주문id_없으면_CustomException() {
// given
Long id = 1L;
// Stubbing
when(orderRepository.findById(id)).thenReturn(Optional.empty());
// when & then
assertThatThrownBy(() -> entityFetcher.getOrderOrThrow(id))
.isInstanceOf(CustomException.class);
}
given: id = 1L 준비
stubbing:
userRepository.findUserById(1L) 호출하면Optional.empty()(= 없다고 응답) 하게 만든다검증:
entityFetcher.getUserOrThrow(1L)를 실행했을 때CustomException이 터지는지 검사한다assertThatThrownBy는
"이 코드 블록이 예외를 던질 것"을 검증하는 방법이다
.isInstanceOf() → 예외 종류 체크
.hasMessageContaining() → 예외 메시지 부분 일치 체크
전체 메시지가 완벽히 일치하는지 체크하려면 .hasMessage()를 써도 된다
| 단계 | 설명 |
|---|---|
| given | 테스트 입력 데이터 준비 |
| stubbing | Mock 객체가 어떻게 응답할지 설정 |
| when & then | 메서드 호출하고, 예외 발생하는지 검증 |
1. Mock 생성
2. EntityFetcher 생성 + Mock 주입
3. 특정 입력 주기 (id, email 등)
4. Mock이 "없음"을 응답하게 Stubbing
5. EntityFetcher 메서드 실행
6. CustomException 발생 여부 확인
| 용어 | 뜻 |
|---|---|
| @Mock | 가짜 객체 생성 |
| @InjectMocks | 가짜 객체들을 주입해서 테스트할 진짜 객체 생성 |
| when-thenReturn | "이 메서드 호출되면 이렇게 응답해라" 설정 |
| assertThatThrownBy | 예외 발생 검증 |
| Optional.empty() | "값 없음"을 표현하는 객체 |
테스트코드까지 마스터하셨군요. 프로젝트기간에도 TIL쓰는 모습!!!! ㄹㅅㅍㅎㄴㄷ