강의

멘토링

로드맵

Inflearn brand logo image

Inflearn Community Q&A

dding2346's profile image
dding2346

asked

Toby's Clean Spring - Domain Model Pattern and Hexagonal Architecture Part 1

Refine Documents and Code

39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.

Resolved

Written on

·

30

·

Edited

0

토비님 안녕하세요. 39. 문서와 코드 다듬기 강의의 updateInfo 테스트 부분 질문이 있습니다.

 

강의 28:30 부근에서 updateInfoFail()에 코멘트를 달게 되는데 성공케이스에 대한 코드는 updateInfo() 부분으로 옮기는 것도 좋아보이는데 토비님 생각이 궁금합니다

 

  • updateInfoFail()의 마지막에 membermember2의 프로필 주소와 중복되는 테스트가 있으므로, member2의 프로필 주소를 설정해주는 코드가 필요하지만, 하나만 있어도 괜찮지 않을까 생각합니다.

  • 그래서 나머지 성공에 대한 코드는 updateInfo() 메소드로 옮겨 "상세 정보 수정이 가능한 경우"들을 나열하는게 좋다고 생각했습니다.

 

똑같은 준비작업이 반복되다보니 한 번 세팅해놓고 여러 케이스를 다 검증해보는 것이 낫다고 하셨는데, 현재 테스트 클래스 메소드가 성공/실패로 나뉘어져있어 성공하는 부분은 다른 메소드로 이동하는게 좋아보인다 생각했습니다. 

 

아래 코드에서 성공 케이스와 실패 케이스로 나누어보았습니다.

코드

  • updateInfo()

@Test
void updateInfo() {
    Member member = registerMember();

    Long memberId = member.getId();
    memberRegister.activate(memberId);
    entityManager.flush();
    entityManager.clear();

    var updateRequest = createMemberInfoUpdateRequest();
    member = memberRegister.updateInfo(memberId, updateRequest);

    assertThat(member.getDetail().getProfile().address()).isEqualTo(updateRequest.profileAddress());

    // 기존 프로필 주소로 계속 변경 요청 가능
    memberRegister.updateInfo(memberId, updateRequest);

    // 다른 프로필 주소로 변경 가능
    memberRegister.updateInfo(memberId, createMemberInfoUpdateRequest("omg123"));

    // 프로필 주소 제거 가능
    memberRegister.updateInfo(memberId, createMemberInfoUpdateRequest(""));
}

 

  • updateInfoFail()

@Test
void updateInfoFail() {
    Member member = registerMember();
    Long memberId = member.getId();
    memberRegister.activate(memberId);
    member = memberRegister.updateInfo(memberId, createMemberInfoUpdateRequest());

    Member anotherMember = registerMember("another@email.com");
    Long anotherMemberId = anotherMember.getId();
    memberRegister.activate(anotherMemberId);
    entityManager.flush();
    entityManager.clear();

    // anotherMember가 member와 프로필 주소 중복
    MemberInfoUpdateRequest duplicateProfileUpdateRequest = createMemberInfoUpdateRequest(member.getDetail().getProfile().address());
    assertThatThrownBy(() -> {
        memberRegister.updateInfo(anotherMemberId, duplicateProfileUpdateRequest);
    }).isInstanceOf(DuplicateProfileException.class);

    // member와 중복되지 않는 프로필 주소로는 변경 가능
    MemberInfoUpdateRequest updateRequest = createMemberInfoUpdateRequest("profile123");
    memberRegister.updateInfo(anotherMemberId, updateRequest);

    // member가 anotherMember와 프로필 주소 중복
    assertThatThrownBy(() -> {
        memberRegister.updateInfo(memberId, updateRequest);
    }).isInstanceOf(DuplicateProfileException.class);
}

 

좋은 강의 해주셔서 감사드립니다!

javaspringspring-bootjpa리팩터링ddd

Answer 1

1

tobyilee님의 프로필 이미지
tobyilee
Instructor

테스트 코드도 리팩터링이 필요한데 제가 강의 진행하면서 빠르게 넘어갔던 부분을 멋지게 정리를 해주셨네요.

미래에 테스트 코드의 가독성을 고려해서 검증 목적에 따라 더 잘게 쪼개보는 방법도 가능할 것 같긴합니다.

테스트 코드를 좀 더 개선한다면 아마도 앞으로 자주 쓰이게 될 회원 오브젝트를 일정 상태로 준비하는 부분을 공통 코드로 추출해서 반복적으로 사용할 수 있게 하면 좋을 것 같네요.

여러가지 아이디어가 떠오르지만, 정상적인 케이스를 검증하는 것과 실패하는 케이스에 집중하는 방식으로 코드를 나누신 것은 아주 좋아보입니다. 코드 읽기도 좋네요.

감사합니다.

 

dding2346's profile image
dding2346

asked

Ask a question