본문 바로가기
Frameworks/Springboot

[Springboot] 간단한 회원 서비스 + JUnit test

by 젊은오리 2022. 7. 7.
728x90

[김영한님의 스프링 입문-코드로 배우는 스프링부트, 웹 MVC, DB접근 기술을 학습 후 정리한 내용입니다.]

회원서비스는 회원가입시에 join()에서 중복아이디만 예외처리해주었고 이외에 findMembers(), findOne()메서드를 정의했다. 서비스에서 호출하는 모든 DB접근 메서드는 앞전에 MemberRepository에 정의해두었고, 별도로 MemoryMemberRepository클래스를 만들어서 MemberRepository의 메서드를 구현해논 상태이다. 

[MemberService.java]

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
package com.example.hellospring.service;
 
import com.example.hellospring.domain.Member;
import com.example.hellospring.repository.MemberRepository;
 
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){
        //중복회원 금지
        validateDuplicateMembers(member);
        memberRepository.save(member);
        return member.getId();
    }
 
    private void validateDuplicateMembers(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);
    }
}
 
cs

 

JUnit test클래스 내부에서 repository를 갖다 쓰기 위해서

MemoryMemberRepository memberRepository = new MemoryMemberRepository();

와 같이 객체를 만들어버리면 실제 Service repository와 다른 repository를 갖고 테스트하는 꼴이 된다.

따라서 Service 클래스에서 다음과 같이 생성자를 만들어서 테스트시에 같은 Repository를 사용하도록 만들어줘야 함을 주의하자.

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

 

 

[MemberServiceTest.java]

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.example.hellospring.service;
 
import com.example.hellospring.domain.Member;
import com.example.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
 
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.*;
 
class MemberServiceTest {
 
    MemberService memberService;
    MemoryMemberRepository memberRepository;
    MemoryMemberRepository memoryRepository = new MemoryMemberRepository();
 
    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    @AfterEach
    public void afterEach(){
        memoryRepository.clearStore();
    }
 
    @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("kang");
 
        //when
        Long saveId = memberService.join(member);
 
        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }
 
    @Test
    void 중복체크(){
        //given
        Member member1 = new Member();
        member1.setName("david");
 
        Member member2 = new Member();
        member2.setName("david");
 
        //when
        memberService.join(member1);
 
        //then
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        assertThat(e.getMessage()).isEqualTo("중복된 회원이 있습니다.");
 
 
    }
    @Test
    void findMembers() {
    }
 
    @Test
    void findOne() {
    }
}
cs
728x90

댓글