inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

MemberServiceTest.java 에서 오류가 나는 이유

303

따라란따라란

작성한 질문수 14

1

섹션 3 회원관리 예제 - 백엔드 개발을 학습 중에 있습니다.

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Optional;

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

// Test 는 한글로 바꾸어도 된다 (실제 prodution 되는 코드는 한글 x) ,test 코드는 build 시 포함 안됨

class MemberServiceTest {

//    MemberService memberService=new MemberService();
    // MemberService 에서 memberRepository 객체와 Test 에서의 memberRepository 객체가 달라서
    // 객체 변수(store) 접근시 다른 store 로 접근할 수 있다
    // 다른 repository 를 이용하기 때문에 문제가 된다
//    MemoryMemberRepository memberRepository=new MemoryMemberRepository();
    MemberService memberService;
    MemoryMemberRepository memberRepository;

    // test 전에 같은 memberRepository 를 가지도록 할 수 있다 (service 와 test 모두 같음)
    // 이와 같은 상황을 DI(Dependency Injection) 의존성 주입 이라고 한다
    @BeforeEach // 각각의 test 메소드 실행 전에 호출되어 처리
    public void beforeEach(){
        memberRepository =new MemoryMemberRepository();
        memberService=new MemberService(memberRepository);
    }

//    // test 실행될 때마다 store 를 지우게 된다
//    @AfterEach // 각각의 test 메소드 실행 후에 호출되어 처리
//    public void afterEach(){
//        memberRepository.clearStore();
//    }

    @Test
    void 회원가입() {
        //given : 이런 data 를
        Member member=new Member();
        member.setName("spring3");

        //when : 이러한 경우에
        Long saveId=memberService.join(member);

        //then : 검증 부분
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    // 예외인 경우가 터지는지 확인하는 것도 중요하다
    @Test
    public void 중복_회원_예외(){
        //given
        Member member1 = new Member();
        member1.setName("spring");

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

        //when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        // message 검증
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        // try catch 활용
/*        try{
            memberService.join(member2);
            fail();
        }catch (IllegalStateException e){
            // 중복 예외 터져서 정상적으로 수행된 경우
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }
    */
        //then
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

위와 같은 코드에서  제가 생각하기에 현재 @BeforeEach 에 의해서 test 메소드 실행전에 memberRepository와 memberService가 각각 new 연산자를 통해서 새롭게 메모리를 부여받는다고 생각합니다.

그래서 @AfterEach 코드가 없어도 매번 새로운 값이기 때문에 서로 중복되는 name을 가지면서 test를 해도 문제가 안된다고 생각하는데 @AfterEach를 생략하고 실행하니 회원가입 메소드에서 중복때문에 오류가 납니다.

제가 어떤 부분을 놓친 건가요??

test spring spring-boot java MVC

답변 1

0

OMG

안녕하세요. 따라란따라란님, 공식 서포터즈 OMG입니다.

아래 링크를 참고해주세요 :)

https://www.inflearn.com/questions/476824

감사합니다.

0

따라란따라란

store 변수가 static 이라 '공유' 되기 때문에 지우지 않게 되면 중복이 될 수 있는 것이군요.

감사합니다!

..

0

76

2

Unused property.....

0

99

2

project JDK is misconfigured

0

132

2

외부 API의 ID 타입(String/UUID)과 내부 도메인의 ID 타입(Long)이 불일치할 때의 설계 정석

0

82

2

단위/통합 테스트 버전충돌 문제

0

91

2

❗️springboot 4.0.2 버전 aspectj dependency 설정❗️

0

230

1

왜 컨트롤러는 변한게 없는데 새로 만든 html 파일이 뜨나요?

0

103

2

윈도우 build test오류 질문

1

102

2

테스트 관련 공부에 대한 조언을 얻고 싶습니다

0

99

2

테스트 실행 시 에러 질문

0

291

1

name을 통한 비교와 객체를 통한 비교

0

77

1

빌드 후 libs 없음

1

129

1

윈도우 gradlew.bat 에러

0

167

1

@PostMapping("/members/new")가 동작하지 않습니다

0

88

1

java static class와 kotlin class

0

79

1

스프링 DB연결

0

126

1

소요 시간

0

85

2

ddl.sql에 빨간 밑줄

1

101

2

welcome page 에러

0

181

3

잘 모르겠습니다.

0

164

2

fail을 똑같이 쳤는데 오류가 발생해요

0

156

2

index.html Welcome page

0

121

1

프로젝트 gradle-groovy ?

0

369

1

테스트코드 메서드명 한글

0

202

2