39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.
토비님 안녕하세요. 39. 문서와 코드 다듬기 강의의 updateInfo 테스트 부분 질문이 있습니다.
강의 28:30 부근에서 updateInfoFail()에 코멘트를 달게 되는데 성공케이스에 대한 코드는 updateInfo() 부분으로 옮기는 것도 좋아보이는데 토비님 생각이 궁금합니다.
updateInfoFail()의 마지막에member가member2의 프로필 주소와 중복되는 테스트가 있으므로,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);
}
좋은 강의 해주셔서 감사드립니다!
답변 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





