회원 서비스 테스트

2023. 5. 1. 05:49카테고리 없음

(테스트 만드는 단축키는 Shift+Ctrl+T)

 

package com.example.demo.service;

import com.example.demo.Repository.MemoryMemberRepository;
import com.example.demo.domain.Member;
import org.junit.jupiter.api.*;

import java.awt.*;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;

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

        //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);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

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

//        try {
//            memberService.join(member2);
//            fail();
//        } catch (IllegalStateException e) {
//            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//        }

        //then
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

 

 

회원가입() :  이걸 만들때 주석처리로 given, when, then 이라는 문법을 넣었는데, 먼저 given(데이터 주는것)에서는  member 생성자를 만들어주고, 이름을 hello로 지어준다. 그리고 when(언제넣을건지)에서는 Long타입에 saveId를 memberService에서 join 안에 member 값을 넣어줄것이다. 마지막으로 then(이렇게 하면 이 값이 나와야한다라는 것) assertThat을 쓸것인데, (아마 바로 쓰면 오류가 날것이다.아까 쓰던 Assertions는 jupiter것이었고 이번에는 assertj로 사용 할것이기 때문에, 처음엔 Assertions.assertThat으로 했다가 바꾼것이다) 먼저 그 결과값을 가져와야 하니까 memberService에 있는 findOne에 saveId의 값을 가져오는 get()을 쓰고, 앞에는 Member에서 findMember라는 변수의 이름으로 만들어주고, 이제 assertThat(알트엔터)에서 member에 가져온 이름이 findmember에서 가져온 getName()과 같은지 비교를 해주기 위해 isEqualTo가 들어온다. 

*하지만 회원가입은 예외가 더 중요하다.*

중복_회원_예외() : 이게 회원 가입보다 더 중요한데 먼저 두가지의 생성자 함수를 만들어준다. member 1, member2. 그리고 이름을 똑같이 spring으로 해주게 된다면 중복이 되어서 memberService에 있는 validateDuplicateMember에서 걸려야한다. 그럴려면 주석으로 작성한 try, catch로 먼저 member2까지 왔다가 실패로 나가게끔 fail()넣어주고, catch로 안에 IllegalStateException e로 만들어서 assertThat으로 e.getmessage e에 작성한 메세지가 memberService에 있는 이미 존재하는 회원입니다. 와 같아야 한다. 이렇게도 할 수 있지만, assertThrows로 IllegalStateException에 class가 memberService에 있는 join에 member2의 값이 걸리도록 해준다. 이것을 IllegalStateException에 e라는 변수이름으로 만들고, 같은지 안 같은지 비교해주는 assertThat을 써준다.

*그러나 이것도 계속해서 테스트를 쓰다가 이 값들이 누적이 되어 저장이 되었기 때문에 실행했을때 오류가 나게된다. 그러므로 전에 repository에서 했던 clear 작업인 @AfterEach 작업으로 한번 실행하고 끝날때 그 저장된 값이 지워지도록 해준다.