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
'Frameworks > Springboot' 카테고리의 다른 글
[Springboot] 싱글톤 컨테이너 개념 정리 (0) | 2022.07.24 |
---|---|
[Springboot] 스프링 컨테이너 & 스프링 빈 개념 정리 (0) | 2022.07.23 |
[Springboot] 객체 지향 설계를 위한 AppConfig 구성 (0) | 2022.07.22 |
[Springboot] 좋은 객체 지향 프로그래밍과 스프링 (0) | 2022.07.20 |
[Springboot] JUnit 통합테스트 개념 정리 (0) | 2022.07.08 |
댓글