Spring/Spring Core Basic

회원 서비스 테스트

JWonK 2022. 1. 5. 16:54
728x90
반응형

앞서 만든 회원 서비스 또한 테스트 과정을 거쳐주어야한다.

 

가장 먼저 회원가입 method join의 테스트 코드를 작성해준다.

 

 

 

→ join method Test Code

 @Test
    void join() {
        // given
        Member member = new Member();
        member.setName("Kim");

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

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

repository test 코드 작성 때 사용했던 assertThat을 똑같이 이용하면 위와 같이 작성할 수 있다.

 

 

 

 

→ 회원가입에서 발생할 수 있는 중복회원예외 경우도 테스트 코드를 작성해준다.

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

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

        // when
        memberService.join(member1);
        assertThrows(IllegalStateException.class, ()-> memberService.join(member2));

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

try ~ catch를 통해 오류를 확인할 수도 있지만 assert에서 제공하는 assertThrows를 통해 간단하게 확인할 수 있다.

 


 

여기서 하나 생각이 들어야하는 것 

회원가입과 중복회원예외 testCase 코드의 경우 같은 레포지토리를 사용하게 되면 오류가 발생한다. 그래서 clear를 시켜주어야하므로 어노테이션 AfterEach를 통해 각 method가 실행된 후 클리어 시켜준다. 

 

하지만 또 여기서 생기는 문제가 memberService 객체와 memberRepository를 생성하여 test코드 안에서만 사용할 경우 test클래스와 service클래스는 아예 다른 repository객체로 확인을 하기에 독립적인 repository가 2개 생긴다는 문제이다.

 

test클래스에서는 test클래스에서 만든 repository에만 의존하고, service클래스에서는 service클래스 내에서 만든 repository에만 의존한다는 문제이다.

 

이런 경우를 방지하기 위해 DI(Dependency Injection)방법을 통해 해결한다. -> 의존성 주입

그럼 바로 전에 구현했던 Service클래스가

package Hello.HelloBus.service;

import Hello.HelloBus.domain.Member;
import Hello.HelloBus.repository.MemberRepository;
import Hello.HelloBus.repository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {
    private final MemberRepository memberRepository;

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

    /* 회원가입 서비스 */
    public Long join(Member member){
        // 같은 이름이 존재하는 중복 회원 생성 x
        validateDuplicateMember(member);
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m->{
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }

    /* 회원 조회 서비스 */
    public List<Member> findMembers(){
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }
}

위와 같이 변경된다. 생성자를 통해 전달받은 객체에 의존성을 주입하는 방식이다. 직접 생성이 아닌 외부에서 객체를 통해 직접 넣어 repository를 사용할 수 있다.

 

 

 

 

 

package Hello.HelloBus.service;

import Hello.HelloBus.domain.Member;
import Hello.HelloBus.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 join() {
        // given
        Member member = new Member();
        member.setName("Kim");

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

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

        // when
        memberService.join(member1);
        assertThrows(IllegalStateException.class, ()-> memberService.join(member2));

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

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

@BeforeEach를 통해 method를 실행하기 전 repository를 생성하고 그 repository객체를 memberService에 주입하여 memberService에서 사용하는 repository와 memberServiceTest에서 사용하는 repository가 같도록 만든 것이다.

 

 

☞ 이렇게 되면 memberService's repository는 memberServiceTest's repository의 의존성 주입을 받게 된다.

 

https://dpdpwl.tistory.com/140

 

[Spring-Boot] 스프링 DI(의존성주입) 예제(Dependency Injection)

스프링 DI (Dependency Injection) 에 대해 알아보겠습니다. DI란? 네.. 의존성 주입이라고 합니다. 의존성 주입? 그럼 의존성 주입에서 의존성이 무엇이냐? 하면.. public class BugService { public void coun..

dpdpwl.tistory.com

 

728x90
반응형