🔥 구현 기능
좋은 단위 테스트는 다음 4가지의 요소를 가집니다.
- 리팩터링 내성
- 회귀 방지
- 빠른 피드백
- 유지 보수성
이 중 리팩터링 내성을 가장 중점적으로 가져가야합니다. 왜냐하면 다른 요소들과 다르게 리팩터링 내성은 있거나 없거나 둘 중 하나이기 때문인데요.
그러나 리팩터링 내성을 너무 강하게 가져가게 될 경우, 타 요소들을 챙기지 못하는 극단적인 경우가 생기기도 합니다.
예를 들어, 현재 Business 객체와 Serivce 객체는 하나의 비즈니스 레이어를 이루고 있습니다. 그리고 각 객체들은 다음과 같은 역할을 수행합니다.
- Business 객체: Service 호출 및 DTO 매핑
- Service 객체: Repository 호출 및 유효성 검사
이 중 Business의 단위 테스트를 예시로 들겠습니다.
@Test
void 회원의_정보를_조회한다() {
// given
when(memberService.findOne(member.getId())).thenReturn(member);
// when
MemberInfoResponse response = memberBusiness.findMemberInfo(member.getId());
// then
assertThat(response.email()).isEqualTo(member.getEmail());
verify(memberService, times(1)).findOne(member.getId());
}
이 코드는 보다 시피 Stub을 통해 Service 단에서의 반환값을 지정하고 있습니다. 이 코드는 리팩터링 내성에 강력하지만, 반대로 코드가 너무 짧다보니 회귀 방지에 대한 능력은 가지고 있지 않습니다. 무엇보다 더 큰 문제는 Stub이 남용되고 있어, 기능에 대한 단위 테스트가 아니라 메서드에 대한 단위 테스트가 됐습니다. 이는 코드 베이스가 커질 경우, 테스트는 정상작동하지만 기능이 고장나는 사태를 유발할 수 있어 지양되어야 하는 테스트 방식입니다.
이를 해결하기 위해 기능을 단위로 하는 테스트를 진행합니다.
- Stub은 데이터베이스 사용과 같은 외부 API만을 대체한다.
- 되도록 가짜 객체보단 진짜 객체를 사용하여 테스트의 신뢰를 높인다.
🚧 작업목록
⏰ 추정 시간
🔗 관련 링크
🔥 구현 기능
좋은 단위 테스트는 다음 4가지의 요소를 가집니다.
이 중 리팩터링 내성을 가장 중점적으로 가져가야합니다. 왜냐하면 다른 요소들과 다르게 리팩터링 내성은 있거나 없거나 둘 중 하나이기 때문인데요.
그러나 리팩터링 내성을 너무 강하게 가져가게 될 경우, 타 요소들을 챙기지 못하는 극단적인 경우가 생기기도 합니다.
예를 들어, 현재 Business 객체와 Serivce 객체는 하나의 비즈니스 레이어를 이루고 있습니다. 그리고 각 객체들은 다음과 같은 역할을 수행합니다.
이 중 Business의 단위 테스트를 예시로 들겠습니다.
이 코드는 보다 시피 Stub을 통해 Service 단에서의 반환값을 지정하고 있습니다. 이 코드는 리팩터링 내성에 강력하지만, 반대로 코드가 너무 짧다보니 회귀 방지에 대한 능력은 가지고 있지 않습니다. 무엇보다 더 큰 문제는 Stub이 남용되고 있어, 기능에 대한 단위 테스트가 아니라 메서드에 대한 단위 테스트가 됐습니다. 이는 코드 베이스가 커질 경우, 테스트는 정상작동하지만 기능이 고장나는 사태를 유발할 수 있어 지양되어야 하는 테스트 방식입니다.
이를 해결하기 위해 기능을 단위로 하는 테스트를 진행합니다.
🚧 작업목록
⏰ 추정 시간
🔗 관련 링크