Time does not change us. It just unfolds us.

Web/JPA

[JPA]JUnit단위 Test 관련 정리

소젬 2021. 11. 23. 14:24

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));

 

참고

https://devuna.tistory.com/39

 

[JUnit] JUnit을 이용한 단위 테스트하기+단정(assert)메소드 정리

[JUnit] JUnit을 이용한 단위 테스트하기+단정(assert)메소드 정리 단위테스트의 중요성을 알고 있었지만, 여러가지 이유(핑계)로 사용하지 않고 있었습니다. 그러던 중 얼마전부터 jUnit을 이용한 단

devuna.tistory.com

 

'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