Service는 Repository(= DAO)를 통해 기능을 수행한다.
Repository객체를 직접 생성하지 않고 생성자를 통해 받아 사용하는 것이 좋다. (= 생산성 주입)
따로 사용할 경우 ServiceTest에서 사용하는 Repository와 다른 Repository를 사용하게 되어 테스트에 문제가 생길 수 있다.
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
함수 추출 (Ctrl + Alt + M)
지정한 로직을 함수로 추출해낸다. 해당 로직은 추출된 함수의 호출로 대체된다.
ex, 사용 전
public Long join(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
memberRepository.save(member);
return member.getId();
}
ex, 사용 후
public Long join(Member member) {
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.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 회원가입() {
Member member = new Member();
member.setName("hello");
Long saveId = memberService.join(member);
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
에러 처리를 위해 try catch 대신 다른 방법을 쓸 수 있다.
memberService.join(member1);
try {
memberService.join(member2);
fail();
} catch(IllegalStateException e) {
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
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