Skip to content

기능 단위의 테스트 수행하기 #227

@mete0rfish

Description

@mete0rfish

🔥 구현 기능

좋은 단위 테스트는 다음 4가지의 요소를 가집니다.

  1. 리팩터링 내성
  2. 회귀 방지
  3. 빠른 피드백
  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이 남용되고 있어, 기능에 대한 단위 테스트가 아니라 메서드에 대한 단위 테스트가 됐습니다. 이는 코드 베이스가 커질 경우, 테스트는 정상작동하지만 기능이 고장나는 사태를 유발할 수 있어 지양되어야 하는 테스트 방식입니다.

이를 해결하기 위해 기능을 단위로 하는 테스트를 진행합니다.

  1. Stub은 데이터베이스 사용과 같은 외부 API만을 대체한다.
  2. 되도록 가짜 객체보단 진짜 객체를 사용하여 테스트의 신뢰를 높인다.

🚧 작업목록

  • Business + Service 단위 테스트 작성

⏰ 추정 시간

🔗 관련 링크

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions