본 캠프_51일차

졸용·2025년 4월 28일

TIL

목록 보기
52/144

✏️ 코드 전체 역할

  • EntityFetcher 클래스의 메서드들이 예외를 잘 던지는지 테스트하는 것

  • 특히 DB에 값이 없을 때, CustomException이 발생하는지 확인하고 있다


1. import 문들

  • AssertJ:
    assertThatThrownBy() 같은 걸 쓰려고 불러온 것 (가독성 좋은 테스트용 라이브러리)

  • Mockito:
    mock(), when() 같은 걸 써서 가짜 객체(Mock)를 만들고 조작하려고.

  • JUnit5:
    @Test, @ExtendWith 쓰려고. (JUnit5 버전이 맞다)

  • 프로젝트 소스들:
    EntityFetcher, CustomException 이런 내가 만든 클래스들도 불러온 것


2. @ExtendWith(MockitoExtension.class)

  • 이 테스트 클래스(EntityFetcherTest)는 Mockito 기능을 확장해서 쓸 거다 선언하는 것

  • 그래야 @Mock, @InjectMocks 같은 게 작동한다


3. 필드들

@Mock
private UserRepository userRepository;

@Mock
private StoreRepository storeRepository;

@InjectMocks
private EntityFetcher entityFetcher;
  • @Mock:
    → 진짜 DB에 접근하는 게 아니라, 가짜 UserRepository, StoreRepository를 만들어서 쓸 거야

  • @InjectMocks:
    → Mockito가 EntityFetcher를 만들면서, 위에서 만든 Mock 객체들을 자동으로 주입(inject) 해줘

즉, 진짜 DB 없이도 EntityFetcher를 테스트할 수 있다


4. 테스트 메서드들

(1) 일치하는_주문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테스트 입력 데이터 준비
stubbingMock 객체가 어떻게 응답할지 설정
when & then메서드 호출하고, 예외 발생하는지 검증

1. Mock 생성
2. EntityFetcher 생성 + Mock 주입
3. 특정 입력 주기 (id, email 등)
4. Mock이 "없음"을 응답하게 Stubbing
5. EntityFetcher 메서드 실행
6. CustomException 발생 여부 확인

✅ 용어 간단 요약

용어
@Mock가짜 객체 생성
@InjectMocks가짜 객체들을 주입해서 테스트할 진짜 객체 생성
when-thenReturn"이 메서드 호출되면 이렇게 응답해라" 설정
assertThatThrownBy예외 발생 검증
Optional.empty()"값 없음"을 표현하는 객체

🎯 꿀팁

  • 테스트 메서드 이름을 한글로 적기를 잘했다
    (요즘은 테스트는 자연어처럼 읽히는 게 좋다고 한다)
profile
꾸준한 공부만이 답이다

3개의 댓글

comment-user-thumbnail
2025년 4월 29일

테스트코드까지 마스터하셨군요. 프로젝트기간에도 TIL쓰는 모습!!!! ㄹㅅㅍㅎㄴㄷ

1개의 답글
comment-user-thumbnail
2025년 4월 29일

와 시작부터 첨보는거 나와서 눈물흘리며 봤습니다. 테스트 코드 내용이었군요. 꿀팁 감사합니다

답글 달기