BE Study/Spring

회원 서비스 테스트

subengineer 2024. 6. 21. 15:13

기존에는 회원 서비스가 직접 회원 리포지토리를 생성하도록 하였다.

이러면 memberService가 생성될 때마다 new를 호출하기 때문에 새로운 리포지토리가 나와 필요없는 작업을 하게 되었다.

따라서 직접 만드는 것이 아니라 Dependency Injection을 통해 리포지토리 생성을 다른 Object에 위임해주었다.

아래는 이를 활용해 생성한 테스트 코드이다.

package hello.hello_spring.service;

import hello.hello_spring.domain.Member;
import hello.hello_spring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

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("spring");

        //when
        Long saveId = memberService.join(member);

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

    @Test
    public void 중복_회원_예외() throws Exception {
        //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() {
    }
}

@BeforeEach : 각 테스트 실행 전에 호출된다. 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하 고, 의존관계도 새로 맺어준다.

 

아직 DI의 개념이 익숙치 않아 필요한 이유는 알지만 어떤 방식으로 활용해야하는지 감이 잘 잡히지 않았다.

좀 더 공부하고 개념을 정립하면서 이와 관련해서 문서를 더 찾아볼 필요가 있어보인다.