12 회원 서비스 테스트

이연희·2022년 1월 20일
0

Spring

목록 보기
12/105
  • 빌드할 때 테스트코드는 포함되지 않는다.
  • 테스트 함수를 한국어로 설정해도 된다.
  • static은 인스턴스와 상관없이 클래스 레벨에 붙는다.
  • static이 사라지면 각각의 인스턴스의 저장소가 여러개 생성된다.

문제점
MemberService.java의 memberRepository와 MemberServiceTest.java와 memberRepository가 서로 다른 저장소: 다른 인스턴스(현재는 static 키워드가 Map store 앞에 붙어어있어서 같은 디비로 사용되지만, static이 없으면 다른 디비가 생성되면서 문제 발생)

해결방안
외부에서 넣어주도록 설계: MemoryService에서 직접 new 해서 객체를 생성하지 않음

같은 memoryRepository 사용

public class MemberService {
    private final MemberRepository memberRepository;

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

memberRepository를 직접 new해서 객체를 생성하지 않고 외부에서 넣어주는 것을 Dependency Injection(의존성주입)이라 한다.


  • 레포지토리 생성
@BeforeEach
    public void berforeEach() {//테스트가 실행할 때마다 생성
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
  • 테스트 검증 메서드 이름 한글 가능
  • 'given-when-then' 구조
@Test
    void 회원가입() {//join
        //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("spring");

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

        //when
        memberService.join(member1);
        //방법1
        try {
            memberService.join(member2);//같은 이름으로 등록이 되면 fail
            fail();
        } catch (IllegalStateException e) {
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }
        //방법2
        assertThrows(IllegalStateException.class, () -> memberService.join(member2));//member2를 넣으면 앞에 예외가 터져야함: 성공
        //방법3
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        //then
    }

스프링입문12(김영한)

profile
공부기록

0개의 댓글