[spring] 회원관리프로그램 - 서비스 테스트 코드 (스프링 입문 by 김영한)

su_y2on·2022년 1월 11일
0

Spring

목록 보기
5/30
post-thumbnail

회원관리프로그램 - 서비스 테스트 코드


이제 service에 있는 함수들도 잘 돌아가는지 테스트를 해보도록하겠습니다.

test모듈에 service라는 패키지안에 MemberServiceTest라는 java class를 만들어줍니다.

특정회원조회와 전체회원조회는 repository test에서 충분히 됐기 때문에 join과 중복체크에 대해서만 진행하도록할게요!

테스트 함수를 작성할 때는 오로지 테스트를 위한 코드이기 때문에 그냥 한글로 알아보기 쉽게 작성해도 무관합니다.

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() { // 테스트 돌릴 때 레포지토리를 넣음 : DI
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    
    @AfterEach
    public void afterEach() {
        memberRepository.clearStore();
    }

    @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());

    }

    @Test
    public void 중복회원예외(){
        //given
        Member member1 = new Member();
        member1.setName("hello");

        Member member2 = new Member();
        member2.setName("hello");

        // when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        //then
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 이름입니다");

    }

   
}


테스트 결과

한글로 작성하니 확실히 한번에 확인하기 더 좋은것 같습니다



Dependency Injection(DI) : 의존성 주입


    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() { // 테스트 돌릴 때 레포지토리를 넣음 : DI
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

이 부분의 코드를 보면 테스트를 진행할 때 memberRepository를 만들어서 memberService에 넣어준다



memberService java class를 보면 아래와 같이되어있다. 즉 memberRepository를 new로 할당하는 것이 아닌 생성자를 통해서 할당되도록 했다.

public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
    ...
    
  }

따라서 test할때 생성자에 memberRepository를 할당할 수 있는 것이다. 이렇게 하면 레포지토리가 테스트 바로 전에 정해지고 같은 레포지토리로 바로 테스트를 진행할 수 있게 된다.

MemberService의 입장에서는 MemberRepository가 외부에서 정해지는 것이다.




참고
DI참고 블로그

0개의 댓글