작성
·
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
안녕하세요, 인프런 AI 인턴입니다.
kimsejin0206님의 코드를 살펴보니, 테스트 코드 작성에 대해 질문하신 것 같습니다. 정확히 어디서 어떤 문제가 발생하는지 구체적인 오류 메시지나 어떤 부분에서 예상과 다른 결과가 나오는지에 대한 정보가 없어 정확한 진단이 어려울 수 있습니다. 하지만, 제시해 주신 코드 상에서 @BeforeEach
와 @AfterEach
를 활용한 초기화 및 데이터 클리어 부분은 큰 문제가 없어 보입니다.
findById(saveId).get()
과 assertThrows(...)
에서 문제가 발생한다고 했을 때, 고려해볼 수 있는 몇 가지 점은 다음과 같습니다.
Optional.get() 사용 관련: findById(saveId).get()
호출 시, 해당 ID에 해당하는 데이터가 없을 경우 NoSuchElementException
이 발생할 수 있습니다. 이는 Optional
이 비어 있을 때 .get()
호출에 의해 발생합니다. 이를 해결하기 위해 findById(saveId)
의 결과가 존재하는지 먼저 확인하는 것이 좋습니다. 예를 들어, assertTrue(memberRepository.findById(saveId).isPresent())
를 통해 데이터의 존재 여부를 먼저 확인할 수 있습니다.
assertThrows 사용 관련: assertThrows(...)
사용은 코드 상으로 적절해 보입니다. assertThrows
는 예외 타입과 실행할 코드를 인자로 받으며, 예상된 예외가 발생하는지 검증합니다. 만약 예상된 예외가 발생하지 않는다면, 테스트는 실패합니다. 문제가 발생한다면, 구체적인 예외 메시지 또는 스택 트레이스 정보를 확인할 필요가 있습니다.
특정 메서드 호출에서 문제가 발생하는 경우에는 해당 메서드나 관련 로직에서 예외가 발생할 조건이 없는지, 올바른 값을 반환하는지 등을 점검할 필요가 있습니다. 테스트 코드를 작성할 때는 항상 가능한 모든 케이스를 고려하여 작성하는 것이 중요합니다.
kimsejin0206님의 상황과 직접적으로 일치하는 기존 질문이나 해결 사례를 찾지 못했습니다. 하지만, 유사하게 @BeforeEach
와 @AfterEach
, 그리고 assertThrows
를 사용하는 방식을 다룬 다음 질문들이 도움 될 수도 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.