인프런 커뮤니티 질문&답변
39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.
해결된 질문
작성
·
64
·
수정됨
0
토비님 안녕하세요. 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
테스트 코드도 리팩터링이 필요한데 제가 강의 진행하면서 빠르게 넘어갔던 부분을 멋지게 정리를 해주셨네요.
미래에 테스트 코드의 가독성을 고려해서 검증 목적에 따라 더 잘게 쪼개보는 방법도 가능할 것 같긴합니다.
테스트 코드를 좀 더 개선한다면 아마도 앞으로 자주 쓰이게 될 회원 오브젝트를 일정 상태로 준비하는 부분을 공통 코드로 추출해서 반복적으로 사용할 수 있게 하면 좋을 것 같네요.
여러가지 아이디어가 떠오르지만, 정상적인 케이스를 검증하는 것과 실패하는 케이스에 집중하는 방식으로 코드를 나누신 것은 아주 좋아보입니다. 코드 읽기도 좋네요.
감사합니다.




