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

kimsejin0206님의 프로필 이미지
kimsejin0206

작성한 질문수

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

회원 서비스 테스트

테스트가 올바르게 되지 않는 것 같아요

작성

·

418

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
여기에 질문 내용을 남겨주세요.

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

class MemberServiceTest {
    MemberService memberService;
    MemoryMemberRepository memberRepository;
    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    @AfterEach
    public void afterEach() {
        memberRepository.clearStore();
    }
    @Test
    public void 회원가입() throws Exception {
        //Given
        Member member = new Member();
        member.setName("hello");
        //When
        Long saveId = memberService.join(member);
        //Then
        Member findMember = memberRepository.findById(saveId).get();
        assertEquals(member.getName(), findMember.getName());
    }
    @Test
    public void 중복_회원_예외() throws Exception {
        //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));//예외가 발생해야 한다.
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }
}

강의를 따라하다가 좀 잘 안되서 pdf내용을 그대로 긁어왔는데 import org.junit.jupiter.api.AfterEach;가 빠져있더라구요. 그것만 수정하면 될 줄 알았는데, get()과 assertThrows에서 문제가 발생하고있는것 같습니다 왜그럴까요?

답변 2

0

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

올리신 테스트 코드를 실행해본 결과 정상적으로 테스트 성공하는 것으로 보아 작성하신 애플리케이션 코드가 강의와 다른 것 같습니다.

테스트 코드에는 문제가 없으니 애플리케이션 코드를 전반적으로 살펴보시고 해결이 안될 경우 댓글 남겨주세요.

모든 클래스를 한번씩 살펴보셔야 할 것 같고,

"이미 존재하는 회원입니다."

여기서 띄어쓰기 혹은 .을 누락하여 테스트가 실패하여 질문을 올리시는 경우가 있으니 참고해서 확인해주세요.

해결이 안될 경우 댓글 남겨주세요

.

image

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

kimsejin0206님의 코드를 살펴보니, 테스트 코드 작성에 대해 질문하신 것 같습니다. 정확히 어디서 어떤 문제가 발생하는지 구체적인 오류 메시지나 어떤 부분에서 예상과 다른 결과가 나오는지에 대한 정보가 없어 정확한 진단이 어려울 수 있습니다. 하지만, 제시해 주신 코드 상에서 @BeforeEach@AfterEach를 활용한 초기화 및 데이터 클리어 부분은 큰 문제가 없어 보입니다.

findById(saveId).get()assertThrows(...)에서 문제가 발생한다고 했을 때, 고려해볼 수 있는 몇 가지 점은 다음과 같습니다.

  1. Optional.get() 사용 관련: findById(saveId).get() 호출 시, 해당 ID에 해당하는 데이터가 없을 경우 NoSuchElementException이 발생할 수 있습니다. 이는 Optional이 비어 있을 때 .get() 호출에 의해 발생합니다. 이를 해결하기 위해 findById(saveId)의 결과가 존재하는지 먼저 확인하는 것이 좋습니다. 예를 들어, assertTrue(memberRepository.findById(saveId).isPresent()) 를 통해 데이터의 존재 여부를 먼저 확인할 수 있습니다.

  2. assertThrows 사용 관련: assertThrows(...) 사용은 코드 상으로 적절해 보입니다. assertThrows는 예외 타입과 실행할 코드를 인자로 받으며, 예상된 예외가 발생하는지 검증합니다. 만약 예상된 예외가 발생하지 않는다면, 테스트는 실패합니다. 문제가 발생한다면, 구체적인 예외 메시지 또는 스택 트레이스 정보를 확인할 필요가 있습니다.

특정 메서드 호출에서 문제가 발생하는 경우에는 해당 메서드나 관련 로직에서 예외가 발생할 조건이 없는지, 올바른 값을 반환하는지 등을 점검할 필요가 있습니다. 테스트 코드를 작성할 때는 항상 가능한 모든 케이스를 고려하여 작성하는 것이 중요합니다.

kimsejin0206님의 상황과 직접적으로 일치하는 기존 질문이나 해결 사례를 찾지 못했습니다. 하지만, 유사하게 @BeforeEach@AfterEach, 그리고 assertThrows를 사용하는 방식을 다룬 다음 질문들이 도움 될 수도 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kimsejin0206님의 프로필 이미지
kimsejin0206

작성한 질문수

질문하기