티스토리 뷰
스프링 버젼이 높아지며 변화한 것 중 하나는 JUnit 기반의 테스트입니다.
4.X에서 JUnit의 테스트 러너를 확장하는 방법 중 하나로 @RunWith(SpringRunner.class) 에노테이션을 사용하였습니다. 스프링 부트를 사용하여 테스트를 진행하는 경우 항상 이 에노테이션을 붙여서 사용했습니다. 아래의 MemberServiceTest 코드를 보시면 알 수 있습니다.
// JUnit 4 버젼의 테스트 코드
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class MemberServiceTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
public void join() throws Exception {
Member member = new Member();
member.setName("kim");
Long saveId = memberService.join(member);
assertEquals(member, memberRepository.findOne(saveId));
}
}
또한 테스트를 진행하며 실패하는 것이 정상 로직인 경우에는 JUnit4에서는 다음과 같이 처리하였습니다.
@Test 에노테이션을 사용해 사용자가 구현해 놓은 예외 클래스나 자바에서 제공하는 기본 예외 클래스를 설정하였습니다. @Test(expected = Exception.class)와 같이 사용하였습니다.
@Test(expected = IllegalStateException.class)
public void 중복_회원_예외() throws Exception {
Member member1 = new Member();
member1.setName("kim");
Member member2 = new Member();
member2.setName("kim");
memberService.join(member1); memberService.join(member2); //예외 발생
fail("예외가 발생해야 한다."); // 이 시점까지 도달하면 테스트 실패
}
JUnit5 에서는 ?
@RunWith
JUnit 5 부터는 @RunWith가 아닌 @SpringBootTest 하나만으로 사용할 수 있습니다. 정확하게 말하면 @RunWith가 아닌 @ExtendWith 에노테이션을 사용하였습니다. @ExtendWith(MyExtension.class) 처럼 Extension 구현체를 지정해 줄 수 있습니다. 앞 서 말씀드린 것 처럼 @SpringBootTest 하나만으로 사용할 수 있는데 스프링에서 제공하는 스프링부트테스트 인터페이스를 들어가보면 @ExtendWith(SpringExtension.class)를 기본적으로 제공하고 있음을 알 수 있습니다 !
정리하자면, JUnit 5 부터는 @RunWith를 사용할 필요가 없고 @ExtendWith를 사용해야 하지만 @SpringBootTest를 사용하면 모두 해결할 수 있습니다.
@Test(expected = Exception.class)
JUnit 5부터 테스트를 진행할 때 예외가 발생하는 것이 올바른 로직인 경우에는 @Test(expected = Exception.class)를 사용하지 않습니다. 결론부터 말하면 AssertThrows를 사용하여 예외를 체크합니다.
1. 기본적인 자바 문법인 try - catch 를 사용하여 예외가 발생한 경우 return 을 시켜 테스트를 통과.
2. assertThrows를 사용하여 예상되는 예외 클래스를 설정한 후, 람다식을 이용해 원하는 로직 실행
기본 자바 문법을 사용하는 1번 방법 보다는 테스트에 보다 더 적합한 2번 방법을 사용하는 것이 좋을 것 같습니다.
정리하자면, JUnit 5 부터는 assertThrows(Exception.class, () -> 원하는 로직))을 사용하여 예외 발생 테스트를 진행할 수 있습니다 !
// Try - Catch 이용
@Test
public void 중복_회원_예외() throws Exception{
Member member1 = new Member();
member1.setName("kim");
Member member2 = new Member();
member2.setName("kim");
memberService.join(member1);
try {
memberService.join(member2); // 예외가 발생해야 한다
} catch (IllegalArgumentException e){
return;
}
fail("예외 발생.");
}
// assertThrows 이용
@Test
public void 중복_회원_예외() throws Exception{
Member member1 = new Member();
member1.setName("kim");
Member member2 = new Member();
member2.setName("kim");
memberService.join(member1);
assertThrows(IllegalArgumentException e.class, () -> memberService.join(member2));
fail("예외 발생.");
}
'Spring' 카테고리의 다른 글
[Spring] JPA 엔티티 매핑 (0) | 2022.05.09 |
---|---|
[Spring] JPA Entity Manager 영속성 컨텍스트 (0) | 2022.04.26 |
[Spring] 서블릿 필터, 스프링 인터셉터 (Filter/Interceptor) (0) | 2022.04.05 |
[Spring] 쿠키와 세션을 이용한 간단한 로그인/로그아웃 (0) | 2022.03.29 |
[Spring] Bean Validation / @Valid, @Validated (0) | 2022.03.25 |
- Total
- Today
- Yesterday
- 스프링MVC
- 런칭 페스티벌
- java
- 스프링 부트
- 환경 별 로깅 전략 분리
- 스프링 프레임워크
- dm-zoned
- 우테코
- ZNS
- jpa
- 피움 6주차 회고
- 3차 데모데이
- 우테코 회고
- 알림개선기
- 스프링 Logback
- 5주차 회고
- 파이썬
- 피움
- 알림기능개선기
- 팀프로젝트
- 백준
- Spring
- 네트워크
- 2차 데모데이
- 회고
- ZNS SSD
- dm-zoned 코드분석
- 8주차 회고
- 프로젝트
- CI/CD
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |