Error/Spring Boot
[Spring Boot] @Test(expected ~) 에러 (Junit4, Junit5)
prao
2023. 7. 13. 15:59
반응형
에러 내용
1) 발생
package jpabook.jpashop.service;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import static org.junit.Assert.*;
@SpringBootTest
@Transactional
public class MemberServiceTest {
@Autowired
MemberService memberService;
@Autowired
MemberRepository memberRepository;
@Autowired
EntityManager em;
@Test
@Rollback(false)
public void 회원가입() throws Exception {
//given
Member member = new Member();
member.setName("kim");
//when
Long savedId = memberService.join(member);
//then
em.flush();
assertEquals(member, memberRepository.findOne(savedId));
}
@Test(expected = IllegalStateException.class)
public void 중복_회원_가입() throws Exception {
//given
Member member1 = new Member();
member1.setName("kim");
Member member2 = new Member();
member2.setName("kim");
//when
memberService.join(member1);
memberService.join(member2); //예외가 발생해야 한다!!
//then
fail("예외가 발생해야 한다.");
}
}
Junit4를 기준으로 하는 강의에서 try-catch문의 역할을 대신하는 @Test(expected = IllegalStateException.class) 코드를 사용하여서 따라 작성하였더니, Junit5 환경에서는 에러 발생.
2) 원인
Junit4와 Junit5의 차이점이 문제. 변경사항이 존재한다. @Test(expected = IllegalStateException.class) 대신 assertThrows(IllegalStateException.class, () -> memberService.join(member2));와 같은 방식으로 처리한다.
3) 해결
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;
...
@Test
public void 중복_회원_예외() {
// givenMember member1 = new Member();
member1.setName("kim");
Member member2 = new Member();
member2.setName("kim");
// when
memberService.join(member1);
assertThrows(IllegalStateException.class, () -> memberService.join(member2));
// then
}
Junit5에서는 @Test 어노테이션을 사용할 때 expected 속성을 사용하지 않습니다. 대신 assertThrows() 메소드를 사용하여 특정 예외가 발생하는지 테스트할 수 있다. 위의 예시 코드에서는 assertThrows() 메소드를 사용하여 IllegalStateException이 발생하는지 검증한다.
Junit5를 사용하면 조금 더 직관적이고 편리한 테스트 코드를 작성할 수 있다.
반응형