Post

MemberService 테스트 코드

Test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.List;

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

class MemberServiceTest {

    MemberService memberService = new MemberService();

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

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

        //then
        assertThat(member.getId()).isEqualTo(saveId);
    }
    @Test
    public void 중복_회원_예외() {
        //given
        Member member1 = new Member();
        member1.setName("user1");

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


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

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

        //then
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

앞서 작성했던 MemberService의 join 메소드에 대한 테스트 코드이다.

join의 경우 member 객체를 생성하는 역할도 있지만 중복 회원에 대한 검사도 같이 진행하게 된다.

그렇기때문에 이 join의 테스트를 진행할 때 잘 작동하는지와 예외가 잘 작동하는지도 검사해야된다.

join에서 예외가 잘 작동하는지 검사하는 확인하기 위한 코드는 아래와 같다.

1
2
3
4
5
// 예외가 같은지
IllegalStateException e = Assertions.assertThrows(IllegalStateException.class, () -> memberService.join(member2));

// 예외 시 보내는 메시지가 같은지
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

예외가 같은지 확인 시 사용하는 메소드는 junit.Assertions의 assertThrows로 확인이 가능하다.

하지만 위 코드에서는 한 가지 문제가 더 있다.

코드 개선

위 코드는 join에 값이 계속 누적되고 있으므로 같은 이름을 가진 member 객체를 생성할 경우 다른 테스트임에도 중복된 값으로 나온다.

그러기 위해선 전 포스팅에서 나온 afterEach를 적용시켜줘야한다.

1
2
3
4
5
6
7
8
9
10
class MemberServiceTest {

    MemberService memberService = new MemberService();
    MemoryMemberRepository memberRepository = new MemoryMemberRepository();
    
    @AfterEach
    public void afterEach() {
        memberRepository.clearStore();
    }

근데 이런 식으로 필드에 MemoryMemberRepository를 생성하면 memberService 안에 있는 MemoryMemberRepository와 MemberServiceTest에 있는 MemoryMemberRepository 다른 객체이다.

이렇듯 memberService안에 있는 객체 대신 다른 객체를 사용한다는 점이 문제다.

이 점을 개선하기 위해 memberService에 생성자를 새로 만들어주자.

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

그 후 테스트를 진행하기 전에 memberService 객체를 생성하기 위해 @BeforeEach 에노테이션을 사용해주자.

1
2
3
4
5
@BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

beforeEach는 각 테스트를 실행하기 전에 실행되며 memberService 객체를 만들어준다.

이렇듯 MemberService 객체를 만들 때 직접 MemberRepository를 만든 것이 아니라 외부에서 만들어 넘겨주는 것을 Dependency Injection(DI)라고 부른다.

This post is licensed under CC BY 4.0 by the author.