인프런 커뮤니티 질문&답변

11 1님의 프로필 이미지
11 1

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 서비스 테스트

MemoryMemberRepository 클래스의 store 변수의 static 유무에 따라 실행 결과가 달라요.

해결된 질문

작성

·

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() {
    }
}

답변 1

1

안녕하세요. 11 1님, 공식 서포터즈 y2gcoder입니다.

JUnit5 의 기본 방식이 각 테스트마다 테스트 클래스의 인스턴스를 새로 생성하기 때문에 말씀해주신 현상이 발생한 것으로 보입니다.

다음 링크(클릭)을 참고해주십쇼!

감사합니다.

11 1님의 프로필 이미지
11 1

작성한 질문수

질문하기