Test 예외처리 및 Junit5 변경 사항
@Test(expected = IllegalStateException.class)
@Test
public void duplicationMemberException() throws Exception {
Member member1 = new Member();
member1.setName("nary");
Member member2 = new Member();
member2.setName("nary");
memberService.join(member1);
try {
memberService.join(member2); //duplication name join
} catch (IllegalStateException e) {
return;
}
Assertions.fail("exception should be accrued");
}
@Test(expected = IllegalStateException.class)
public void duplicationMemberException() throws Exception {
Member member1 = new Member();
member1.setName("nary");
Member member2 = new Member();
member2.setName("nary");
memberService.join(member1);
memberService.join(member2); //duplication name join
Assertions.fail("exception should be accrued");
}
예외에 대하여 try catch문 없이 annotation 설정을 통해 처리할 수 있다.
그러나 나는 현재 Junit4가 아닌 5를 쓰고 있어서 "expected" 예약어 사용이 안되고, 아래처럼 구현해야 한다.
Assertions.assertThrows(IllegalStateException.class, () -> {
memberService.join(member2);//duplication name join
});
계속 헷갈렸던 부분은 아래 내 코드에서 test 실패가 언제 처리되는지였다.
@Test
public void excessStock() throws Exception {
Member member = createMember();
Item book = createBook("JPA bible", 10000, 10);
int orderCnt = 11;
assertThrows(NotEnoughStockException.class, () -> {
orderService.order(member.getId(), book.getId(), orderCnt);
}, "NotEnoughStockException is accrued");
//fail("excessStock exception");
}
JUnit4의 경우 예외처리 부분에서 예외가 발생되어 fail로 넘어가지 않고 Test 실패처리되는데, JUnit5에서는 예측한 예외가 발생했을 경우 통과로 넘어가기 때문에 확인을 위한 fail을 작성하면 안된다.
inflearn 답변 :
Assertions.assertThrows() 에서 사용자가 예측한 오류가 던져질 경우엔 테스트 성공으로 처리되며 프로세스가 중단되지 않고 다음 프로세스를 진행하게 됩니다. 테스트가 실패하면 그 테스트는 종료되지만 테스트가 통과한 경우에는 테스트의 끝 (@Test가 붙은 함수의 끝) 까지 프로세스를 계속 진행하게 됩니다.
그 외에도 @RunWith(SpringRunner.class) 는 @ExtendWith(SpringExtension.class)로 사용해야 하고,
Test Class 및 Method가 package private이어도 된다. (public -> default이면 됨)
JUnit 이해
JUnit이란 자바용 단위테스트(Unit Test)도구이다.
그렇다면 단위테스트란 소스코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차로 모든 함수와 ㅁ소드에 대한 Test Case를 작성한다.
- @Test 메서드가 호출할 때 마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지게 한다.
- jUnit4부터는 어노테이션으로 간결하게 테스트를 지원한다.
- 단정(assert) 메서드로 테스트 케이스의 수행 결과를 판별할 수 있다.
간단한 테스트를 하면서 내가 사용한 함수들은 아래들과 같다.
Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
Assertions.fail("exception should be accrued");
Assertions.assertThrows(IllegalStateException.class, () -> {
memberService.join(member2);
});
Assertions.assertEquals(member, memberRepository.findOne(savedId));
참고
'Web > JPA' 카테고리의 다른 글
[JPA]객체지향 쿼리 (0) | 2021.11.25 |
---|---|
[JPA]Transcation, 영속성Context, EntityManager (0) | 2021.11.23 |
[JPA]JPQL(Java Persistence Query Language) (0) | 2021.11.22 |
[JPA]Annotation 정리 (0) | 2021.11.18 |