해결된 질문
작성
·
507
·
수정됨
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
11:36 부분 내용처럼 MemberServiceTest의 join() 관련 테스트 코드 부분에서 setName()에 hello가 아닌 spring을 매개값으로 주고 실행하면 강의에서 보여주신 거와 마찬가지로 저도 오류가 나더라구요. 저는 회원 중복 검증하는 부분에서 오류가 났습니다. 물론 afterEach()는 안 한 상태에서요.
그런데 MemoryMemberRepository의 store 변수에 있는 static을 지우면 afterEach()를 작성하지 않았음에도 MemberServiceTest를 실행해도 오류가 나지 않습니다. 이유가 뭔가요?
MemberServiceTest 클래스에선 memberService 객체를 하나 만들었고 그 하나 가지고 코드를 짰으니깐, store 변수가 static이든 아니든 그게 그거 아닌가요? 어차피 memberService 객체 하나를 공유하니까요. 여러 개를 만들었다면 모를까..
왜 static 유무에 따라 오류가 나고 오류가 안 나는 것일까요?
아래 코드는 MemoryMemberRepository 클래스의 store 변수에 static이 있는 상태라서 Test 클래스를 실행하면 오류가 나지만, store 변수에 static을 지우고 Test 클래스를 실행하면 오류가 안 납니다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(), member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
//return (List<Member>)store.values();도 가능한지 확인해 보기.
return new ArrayList<>(store.values());
}
public void clearStore() {
store.clear();
}
}
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
public Long join(Member member) {
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);
}
}
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
MemberService memberService = new MemberService();
// MemoryMemberRepository memberRepository = new MemoryMemberRepository();
//
// @AfterEach
// public void afterEach() {
// memberRepository.clearStore();
// }
@Test
void join() {
// 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
void 회원_중복_검증() {
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// try {
// memberService.join(member2);
// fail();
// } catch(IllegalStateException e) {
// Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
// }
}
@Test
void findMembers() {
}
@Test
void findOne() {
}
}