🎁 모든 강의 30% + 무료 강의 선물🎁

인프런 워밍업 스터디 클럽 3기 4주 차 발자국

섹션 7: Mockito로 Stubbing하기

Test Double 종류

  • Dummy: 아무 기능도 없는 객체.

  • Fake: 간단한 형태로 실제 기능 수행 가능하지만, 프로덕션에 적합하지 않은 객체.

  • Stub: 미리 준비된 결과를 반환하는 객체로, 상태 검증에 사용.

  • Spy: Stub이면서 호출 기록을 제공하며 일부는 실제 객체처럼 동작 가능.

  • Mock: 특정 행위를 명세하고 동작하도록 설계된 객체로, 행위 검증에 사용.

Mockito 주요 어노테이션

  • @Mock: Mock 객체 생성.

  • @Spy: 실제 객체의 메서드를 수행하되 특정 메서드만 Mocking.

  • @InjectMocks: Mock과 Spy 객체를 자동 주입.

BDDMockito

  • 행동 주도 개발 방식으로 given().willReturn()을 사용하여 테스트 작성.

Classicist vs Mockist

  • Classicist: 실제 객체를 사용해 자연스럽고 직관적인 테스트. 리팩토링에 유리하지만 상태 검증만으로는 동작 오류를 놓칠 수 있음.

  • Mockist: 모든 협력자를 Mock으로 대체하여 동작을 명확히 검증. 세부 구현에 의존적이라 리팩토링 시 테스트가 깨질 가능성이 있음.

섹션 8: 더 나은 테스트 작성법

테스트 작성 원칙

  • 한 테스트는 한 목적만 가져야 하며, iffor 사용을 지양.

  • LocalDateTime.now() 같은 제어 불가능한 값은 파라미터로 넘겨 제어.

테스트 환경 독립성

  • 공유 자원을 사용하지 말고, 테스트 간 독립성을 보장.

  • 픽스처(Test Fixture)는 각 테스트가 내부 구현을 몰라도 이해 가능해야 함.

Test Fixture 클렌징

  • deleteAll(): 순차적으로 삭제, 성능 저하 우려.

  • deleteAllInBatch(): 단일 SQL DELETE 쿼리로 대량 데이터 삭제 가능.

반복 및 동적 테스트

  • @ParameterizedTest: 여러 파라미터 값으로 반복 테스트.

    • 예: CsvSource, MethodSource 활용.

  • @DynamicTest: 런타임에 동적으로 테스트 케이스 생성 및 실행.

통합 환경 최적화

  • 서버 부팅 횟수를 줄이기 위해 통합 테스트 클래스를 상속 구조로 설계.

    • 예: @SpringBootTest, @ActiveProfiles("test").

Private 메서드와 테스트 전용 코드

  • Private 메서드는 직접 테스트하지 말고, 객체 분리를 통해 public 메서드로 검증.

  • 테스트 전용 메서드는 필요하면 작성 가능하나 신중히 접근.

추가 내용

  • Spring REST Docs vs Swagger

    • REST Docs: 신뢰도 높고 프로덕션 비침투적이지만 설정이 복잡함.

    • Swagger: 적용이 쉽고 API 호출 가능하지만 프로덕션 코드에 침투적이고 신뢰도가 낮음.

 

 

 

 


후기

 

생각보다 봐야할 강의 양도 많고 이해하기가 어려워서 한 강의당 3번씩 돌려본것 같다.

특히나 하다가 테스트를 시도했는데. 아니 강의에서는 통과하는데 나는 실패했을때 실패지점 찾는데 진짜 애먹었다.

 

정신나갈뻔한 상황도 많았지만 많이 배울 수 있었다. 그럼에도 아직 어려운 부분이 많았다.

 

 

 


댓글을 작성해보세요.


채널톡 아이콘