스프링/0. 입문, 전체방향

10장 회원 서비스 테스트

sdafdq 2023. 7. 8. 14:19
class MemberServiceTest {
    MemberService memberService;
    MemoryMemberRepository memberRepository;


    @BeforeEach  //코드 하기 전에 실행.
    public void beforeEach(){
        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);     //동일 이름이 있을 시 예외 던짐. 아니면 제대로 memberRepository에 save 되고 id 반환

        //then              결과, 검증          보통 거의 다 이렇게 됨. 모두 해당되는 건 아님. GWT
        Member findedMember = memberService.findOne(saveId).get();    //.get()은 보통 테스트때에만 씀.
        Assertions.assertThat(member.getName()).isEqualTo(findedMember.getName());
    }

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

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


        //when
        memberService.join(member1);

        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));   //assertThrows는 junit 함수. 예외를 반환.
                                                                                        //뒤의 람다식을 실행 시, 앞쪽의 예외를 throws해야 성공. 아니면 멈춤.
        Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

//        try{
//            memberService.join(member2);
//            fail(); //Junit의 에러 발생시키는 함수. 같은 이름이므로 예외 없이 정상적으로 작동하면 실패임.
//        }catch (IllegalStateException e){
//            Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//        }


        //then
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

 

public class MemberService {    //Ctrl + Shift + T 테스트 바로 만들기.
    private final MemberRepository memberRepository;

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

기존 멤버 서비스에서 저렇게 외부에서 Repository를 넣어주는 형식으로 바꿈.

이게 DI라고 하는데 다음장에 제대로 알려준다고 함.

 

given 주어진 상황

when 어떻게 했을 때

then 이렇게 되야 됨.

보통 함수 안에 이 세가지 역할이 있음. 아닌 것도 있음.

 

참고로 assertThrows는 junit 거임.

주석처리 해둔 try catch로도 검증 가능하긴 함.