[SpringBoot] #12 - 회원 서비스 테스트

728x90

https://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

1. 편하게 Test 생성 하는법

 

Class 에서 단축키 Ctrl + Shift + T 를 누르면 새 테스트 생성 가능

 

 

테스트 하고 싶은 멤버변수를 체크 후 확인을 누르면 손쉽게 @Test 껍데기가 만들어진다.

@Test는 한글이름으로 적어줘도 상관없다.

 

2. Given - When - Then 패턴으로 @Test 채워넣기 

- Given : 뭔가가 주어져

- When : 실행했을 때 

- Then : 이러한 결과가 나와야 한다.

 

- 회원가입 (정상 플로우)

    MemberService memberService = new MemberService();
    @Test
    void 회원가입() {
        //given-when-then 문법

        //given
        Member member = new Member();
        member.setName("kim");

        //when :memberService.join 에 member 객체를 넣어서 검증하여
        // saveId로 리턴 (저장한 ID가 나옴)
        Long saveId = memberService.join(member);

        //then
        Member findMember = memberService.findOne(saveId).get();
        Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());

    }

 

Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());에서

static import로 넘기는 단축키 alt+enter 를 눌러준다.

그 후 테스트를 돌려보면 아래와 같이 녹색 불이 뜬다.

 

- 회원가입 (예외 플로우)

 

1. try-catch 를 사용하는 방법

    @Test
    public void 중복_회원_예외(){
        //중복회원 저장

        //given
        Member member1 = new Member();
        member1.setName("Lee");

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

        //when
        memberService.join(member1);

        try {
            memberService.join(member2);// 이름이 같기 때문에 예외가 터져야함
            fail();
        } catch (IllegalAccessError e){
            //예외가 터져서 정상적으로 실행 됨.
            //then
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }
    }

2. IllegalStateException 사용

@Test
    public void 중복_회원_예외(){
        //중복회원 저장

        //given
        Member member1 = new Member();
        member1.setName("Lee");

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

        //when
        memberService.join(member1);

        //memberService.join(member2) 를 태울 때 IllegalStateException.class 예외가 터지는 것을 기대한다.
        //assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        //만약 nullpointException 을 하는 경우 테스트 실패

        // 위 코드에서 ctrl + alt + v
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
	}

 

3. Clear 해주기

위 코드에서 Test를 돌릴 때 회원가입의 아이디와 중복확인 아이디가 같은 경우 예외가 발생

→ DB에 계속 값이 쌓이기 때문

그렇기 때문에 Clear를 해 주어야 한다.

    //clear를 위해 추가
    MemoryMemberRepository MemberRepository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach(){
        MemberRepository.clearstore();
    }

 

memberService에서 사용하는 MemoryMemberRepository와 테스트 케이스에서 사용하는 MemoryMemberRepository의 Repository가 달라 문제가 생길 수 있기 때문에 같은 인스턴스로 테스트 할 수 있도록 아래와 같이 수정한다.

 

MemberService.class

public class MemberService {

    private final MemberRepository memberRepository ;

    //직접 new 하여 생성하지 않고 외부에서 넣어주도록 바꾼다.
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

 

MemberServiceTest.class

class MemberServiceTest {

    MemberService memberService;

    MemoryMemberRepository MemberRepository;


    //동작 전 실행
    @BeforeEach
     public void beforeEach(){
        MemberRepository = new MemoryMemberRepository();
        memberService = new MemberService(MemberRepository);
    }

    //동작 후 실행
    @AfterEach
    public void afterEach(){
        MemberRepository.clearStore();
    }

 

 

728x90