인프런 워밍업 스터디 클럽 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: 더 나은 테스트 작성법
테스트 작성 원칙
한 테스트는 한 목적만 가져야 하며,
if
와for
사용을 지양.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번씩 돌려본것 같다.
특히나 하다가 테스트를 시도했는데. 아니 강의에서는 통과하는데 나는 실패했을때 실패지점 찾는데 진짜 애먹었다.
정신나갈뻔한 상황도 많았지만 많이 배울 수 있었다. 그럼에도 아직 어려운 부분이 많았다.
댓글을 작성해보세요.