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

+ Recent posts