inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

문서와 코드 다듬기

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

해결된 질문

90

강명덕

작성한 질문수 5

0

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

 

강의 28:30 부근에서 updateInfoFail()에 코멘트를 달게 되는데 성공케이스에 대한 코드는 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(""));
}

 

@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);
}

 

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

java spring spring-boot jpa 리팩터링 ddd

답변 1

1

토비

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

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

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

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

감사합니다.

 

N+1 관련해서 질문있습니다.

0

45

3

도메인 모델에서 관계와 규칙을 구분하는 방법

0

61

2

헥사고날 아키텍처에서의 배치, 시큐리티, 비동기 이벤트 처리는 어떻게 하나요?

0

140

2

어댑터에서 도메인에 직접 의존하는 경우에 대해

0

136

2

Member 도메인이 PasswordEncoder를 받는 구조 질문 있습니다.

0

118

2

MemberService와 EmailSender 책임 분리에 대한 질문

0

109

2

NonNullApi를 NullMarked로 대체하라고 합니다.

0

133

2

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

0

81

2

Repository Adapter 설계에 대해 피드백을 부탁드립니다

0

112

2

헥사고날 part2 강의 출시 예정일 문의 드립니다.

0

264

2

PT 문의사항

0

104

1

초기 어플리케이션 구동 시 compose.yml 파싱 오류

0

153

2

애플리케이션의 JPA 리턴과 도메인 모델

0

131

2

애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의

0

140

2

페이징 처리를 해야한다면 어떻게 해야할까요?

0

197

2

애그리거트의 repository

0

128

2

Domain Expert가 정확히 어떤 역할을 하는 사람인가요?

0

239

1

회원 애플리케이션 서비스 테스트 (1)

0

110

2

정적 팩토리 메서드 관련 질문드립니다!

0

112

2

spotbug + @NonNullApi 로만 Null 방어가 될까요?

0

132

2

required 포트에 관해서

0

95

2

혹시 다음 편은 언제쯤 오픈할까요?

0

173

2

서비스 단위 테스트 코드 작성

0

104

2

domain 모듈에 entity를 정의한다고 했을때

0

106

2