Service는 Repository(= DAO)를 통해 기능을 수행한다.
Repository객체를 직접 생성하지 않고 생성자를 통해 받아 사용하는 것이 좋다. (= 생산성 주입)
따로 사용할 경우 ServiceTest에서 사용하는 Repository와 다른 Repository를 사용하게 되어 테스트에 문제가 생길 수 있다.
private final MemberRepository memberRepository;
// Dependency Injection
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
함수 추출 (Ctrl + Alt + M)
지정한 로직을 함수로 추출해낸다. 해당 로직은 추출된 함수의 호출로 대체된다.
ex, 사용 전
// 회원 가입
public Long join(Member member) {
// 같은 이름이 있는 중복 회원 X
memberRepository.findByName(member.getName())
// ifPresent() : Optional의 기능. 담긴 객체가 null이 아닐 경우 호출된다.
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
memberRepository.save(member);
return member.getId();
}
ex, 사용 후
// 회원 가입
public Long join(Member member) {
// 같은 이름이 있는 중복 회원 X
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}
// 중복 회원 검증
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
// ifPresent() : Optional의 기능. 담긴 객체가 null이 아닐 경우 호출된다.
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
assertThat().isEqualTo()를 사용하기 위한 Assertions는
import static org.junit.jupiter.api.Assertions.*; 이 아니라
import static org.assertj.core.api.Assertions.*; 이다.
JUnit 테스트를 위한 @BeforeEach, @AfterEach
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository); // 생성자 주입
}
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
Test 클래스는 일일히 따로 만들지 않아도 된다.
Test하려는 클래스에 커서를 두고 Ctrl + Shift + T 를 통해 자동으로 생성할 수 있다. (패키지까지 자동 생성된다.)
Test 함수의 로직은 given, when, then 순으로 작성하는 것이 좋다. Test 함수명은 한글로 써도 무방하다.
@Test
void 회원가입() {
// given : 주어진 것들로
Member member = new Member();
member.setName("hello");
// when : 이걸 실행했을때
Long saveId = memberService.join(member);
// then : 이런 결과가 나와야 됨
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
에러 처리를 위해 try catch 대신 다른 방법을 쓸 수 있다.
// when
memberService.join(member1);
// 방법 1
try {
memberService.join(member2);
fail();
} catch(IllegalStateException e) {
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
// 방법 2
// 오른쪽 파라미터의 로직을 실행했을때 왼쪽 파라미터의 에러를 반환
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
출처 : www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard