TDD 연습 프로젝트 3 - 멤버십 API 구현(Membership Service)

zunzero·2022년 9월 6일
0

스프링, JPA

목록 보기
11/23

멤버십 등록 API

요구사항

  • 나의 멤버십 등록 API
    - 기능: 나의 멤버십을 등록합니다.
    • 요청: 사용자 식별값, 멤버십 이름, 포인트
    • 응답: 멤버십 ID, 멤버십 이름

Service 계층 개발

멤버십 등록 실패 (중복 존재)

우선 사용자ID와 멤버십타입으로 이미 멤버십이 존재하여 실패하는 테스트부터 작성한다.
즉, membershipRepository의 findByUserIdAndMembershipType을 호출했을 때의 결과가 null이 아니어야 한다.
그리고 그에 대한 결과로 Exception을 던지도록 구현하고자 하는 테스트 코드를 아래와 같이 작성했다.

doReturn..., assertThorws..., 일단 Mockito와 JUnit, assertj에 대한 학습이 너 ~ 무 부족한 것 같다... ㅎ

@InjectMocks는 테스트할 객체를, @Mock은 의존성 있는 객체를 어쩌구하는 것 같은디... 모르겠다. 이것도 ㅋㅋ;

우선 addMembership이라는 메서드 호출 시 발생하는 에러를 처리하는 과정에서 컴파일 에러가 발생하기 때문에 이 부분에 대한 구현을 작성하도록 한다.

컴파일 에러는 해결되었지만, 다음과 같은 문구를 띄우며 테스트는 실패한다.

Expected hello.tdd.error.MembershipException to be thrown, but nothing was thrown.

컴파일 에러 해결을 위해 return null;로 급하게 작성하였기 때문에, 오류를 던지지 않아서 실패하게 된 것이다.
따라서 우리는 해당 에러 해결을 위해 MembershipRepository에서 Membership을 조회하여, 있으면 에러를 throw하도록 코드를 수정하면 된다.

코드 수정 후, 우리의 테스트는 아름답고 성공적으로 마무리 되었다.
중복 멤버십이 있으면 에러를 던지는 테스트 성공!

멤버십 등록 성공

이제는 멤버십 등록에 성공하는 테스트 코드를 작성해보도록 하자.

Mockito의 doReturn 같은 메서드들에 익숙하지 않아 아직 완벽하게 이해가 되지는 않는다.
우선 문맥상 대략 파악해두고 넘어가자.
해당 테스트는 NullPointerException이 발생할 것이다.
왜냐하면 addMembership 메서드는 에러를 던지거나 null을 던지도록 코드가 짷여있기 때문이다.
따라서 Service 코드를 수정하면 된다.

멤버십 등록 테스트도 깔끔하게 성공하였다.
이제는 리팩토링의 단계를 거쳐야할 시기이다.
MembershipService에서 컨트롤러로 Membership엔티티를 그대로 반환한다.
엔티티를 그대로 외부에 노출하는 것은 위험한 방식이므로, DTO로 바꾸어서 데이터를 주고 받아야 한다.
우선 테스트 코드부터 수정하도록 하겠다.

너무나도 익숙한 컴파일 에러가 발생하였고, 우리는 컴파일 에러를 해결하는 방향으로 코드를 수정하면 된다.

테스트는 매우 성공적으로 통과하게 된다.

profile
나만 읽을 수 있는 블로그

0개의 댓글