반응형
SMALL
MemberService.java
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
// 보통 서비스 쪽은 비즈니스 같이 네이밍하기
// 그냥 아래처럼 하면, 테스트 케이스 때 호출할 memberRespository와 다른객체이다.
// private final MemberRepository memberRepository = new MemoryMemberRepository();
// 두개를 쓸 이유도 없고, MemoryMemberRepository에서 static으로 되어있긴 하지만,
// static은 인스턴스 레벨이 아닌, 클래스 레벨이 붙는 거이기도 하고,
// 그러니 바꾸는 게 좋다.
// 테스트케이스와 같은 인스턴스를 쓰게 하려면....
private final MemberRepository memberRepository;
// constructor 생성해주고,
// 레포지토리를 외부에서 넣어주도록 생성하고,
// test 할때 @BeforeEach를 사용하여 객체 만들어주기
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
// 회원 가입
// 회원가입하면 아이디 반환
public Long join(Member member){
// 같은 이름 중복 회원X (일단 예시에서는)
// result 값이 Optional 객체 타입이라 가능한 일!
// null값이 나올 것 같으면, 일단 Optional 로 감싸주고, Optional에서 사용할 수 있는 함수도 사용!
// ifPresent() => null이 아니라 값이 있으면
// Optional<Member> result = memberRepository.findByName(member.getName());
// result.ifPresent(m -> {
// throw new IllegalStateException("이미 존재하는 회원입니다.");
// });
// 코드 정리
validateDuplicateMember(member); // 중복회원검증
memberRepository.save(member);
return member.getId();
}
// 중복회원 검증
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
// 전체 회원 조회
public List<Member> findMembers(){
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId);
}
}
MemberServiceTest.java
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
// 테스트 자동으로 만들어주는 단축키
// ctrl + shift + T
// 테스트는 과감하게 한글로 바꿔도 된다!
// 테스트는 정상 플로우도 중요하지만, 예외 플로우가 훨씬 더 중요하다.
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
// 사실상 반쪽짜리 테스트 케이스...
@Test
void 회원가입() {
// given
Member member = new Member();
member.setName("spring");
// when
Long saveId = memberService.join(member);
// then
Member findMember = memberService.findOne(saveId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}
// 회원가입 로직에서 회원정보가 잘 저장이 되었는지 체크하는 것도 중요하지만,
// 중복회원이 나타났을 때, 예외가 잘 터뜨려지는지 체크하는 것도 중요하다!
@Test
public void 중복_회원_예외() {
// given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
// when
memberService.join(member1);
// try catch 구문을 안 사용해도될 문법 존재!
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// try {
// memberService.join(member2);
// fail();
// }catch (IllegalStateException e){
// Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// }
// then
}
@Test
void findMembers() {
}
@Test
void findOne() {
}
}
# 기억해야할 사항
1. join 로직에서...
- Optional 객체에서 사용 가능한 ifPresent() 함수 알아두기
- validateDuplicateMember 부분을 단축키 「ctrl + shift + M (extract Method)」 로 따로 떼어냈다.
2. MemberServiceTest 에서
- 하나하나 테스트 케이스 모두를 작성하는 것이 아니라, MemberService 클래스에서 단축키 「ctrl + shift + T」를 사용하여 테스트 자동으로 만들 수 있다.
- @BeforeEach와, MemberService에서 생성자를 따로 만들어주지 않으면, 본 로직과 테스트 케이스에서 호출할 memberRepository가 다른 객체가 된다. 그러므로 주의하자.
- 이제는 DI(Dependency Injection) 의존관계가 주입되었다!
반응형
LIST
'Spring' 카테고리의 다른 글
[spring] 책 목록 구현 + 제목으로 검색 (0) | 2023.05.22 |
---|---|
회원리포지토리 테스트 케이스 작성 (0) | 2022.09.13 |
댓글