Today I Learned

2024 스파르타 내일배움캠프 Sping 트랙 참여 // day55

shinelee26 2024. 12. 17. 22:32

오늘 진행한 학습 요약

1. 테스트코드 실습 특강

  • Mocking이란?
  • Mocking이 필요한 이유
  • Mocking의 중요성
  • Mocking 시 주의할 점
  • Test Double 용어 정리
  • 테스트 코드 실습

2. 알고리즘 코드카다  Day59~60(작성 생략)

CodingTest Git-hub 링크 : https://github.com/chews26/CodingTest

 


학습 정리

1. 테스트코드 실습 특강

 

Mocking이란?

  • Mocking이란 테스트 코드 작성 시 실제 객체나 외부 의존성을 흉내 내는(Mock) 가짜 객체를 만들어 사용하는 기법입니다.
    • 실제 서비스를 대체하는 가짜 서비스를 만들어 테스트를 진행합니다.

 

Mocking이 필요한 이유

  • 외부 자원 의존 로직 테스트 간편화
    • DB나 외부 API 호출을 대체하여 번거로움과 네트워크/셋업 문제를 해결.
    • Mock 객체로 연결 없이도 테스트 가능.
  • 독립적이고 빠른 테스트
    • 단위 테스트는 작고 빠르게 돌아야 의미 있음.
    • Mock을 사용해 핵심 로직 검증 가능.
  • 복잡한 로직 단순화 및 에러 조기 발견
    • 외부 로직을 단순화하여 내 코드 검.
    • 빠르게 에러 원인을 찾을 수 있음.

 

Mocking의 중요성

  • 단위 테스트 독립성
    • 외부 의존성과 분리하여 속도와 재현성 보장.
  • 테스트 범위와 정확성 향상
    • 다양한 시나리오(Mock으로 성공/실패 등) 제어.
  • 유지 보수 용이성
    • Mock을 사용하면 테스트 코드 가벼움.
  • 빠른 피드백
    • TDD, 빌드 파이프라인에서 빠르게 결과 확인.
  • 결합도 감소
    • DIP 원칙을 준수하고 인터페이스 기반 설계.
  • 비즈니스 로직 검증 집중
    • 핵심 로직 검증에 집중 가능.

 

Mocking 시 주의할 점

  • 과도한 Mock 남발
    • 실제 코드와 동작 차이를 놓칠 수 있음.
    • 통합 테스트 병행 필요.
  • 잘못된 Mock 설정
    • when() 남발로 세부 구현에 의존적일 수 있음.
  • 유지 보수 복잡성
    • Mock 설정과 실제 로직 간의 갭이 발생할 수 있음.
  • 명확한 이름 사용
    • MockUserRepository, StubPaymentService처럼 명시적 네이밍.

 

Test Double 용어 정리

  • Dummy
    • 역할 없이 자리 채우기용.
  • Fake
    • 간이 구현체(예: In-memory DB).
  • Stub
    • 고정된 응답 반환.
  • Spy
    • Stub + 호출 이력 기록.
  • Mock
    • 기대치 설정 및 검증.

 

테스트 코드 실습

  • Spring Boot 예제 구조
    1. 기술 스택
      • Spring Boot, JUnit 5, Mockito, H2 Database, Lombok
    2. Controller 테스트
      • @WebMvcTest로 Web 레이어 집중 테스트.
      • @MockitoBean으로 Service Mocking.
    3. Service 테스트
      • @Mock과 @InjectMocks로 의존성 주입.
      • Mockito를 사용한 Stubbing.
    4. Repository 테스트
      • @DataJpaTest로 JPA와 인메모리 DB(H2) 테스트.