Spring/SpringBoot_JPA

테스트 예외처리

민철킹 2021. 5. 20. 16:05

오늘 테스트 코드를 작성하다 공부한 내용을 정리해보려한다.

 

먼저, 현 시점 기준으로 SpringBoot가 사용하는 테스트 유닛은 Junit5이다.

고의로 예외를 발생시키는 실패 테스트에서 작성자는 어떻게 예외를 처리해야할까?

 


상황 가정

  • 회원 저장소에 회원을 저장하는데 이름이 같은 중복회원있으면 Exception
  • 저장할 때 중복회원이 존재하는지 체크하여 존재한다면 throw new IllegalStateException() 

 

 

try-catch

가장 기본적인 예외처리 방식인 try-catch문을 사용하는 방식

@Test
public void 중복회원_예외() {
    Member member1 = new Member();
    member1.setName("son");

    Member member2 = new Member();
    member2.setName("son");

    memberService.join(member1);
    try {
        memberService.join(member2); // 예외 발생해야함.
    } catch (IllegalStateException e) {
        return;
    }

	Assert.fail("예외가 발생해야 한다."); // 이 메서드가 실행되면 테스트는 실패!
    }
  • 예외가 발생한다면 return시켜 테스트를 성공시킴.

 

 

expected속성 사용 ==> Junit4
@Test(expected = IllegalStateException.class)
public void 중복회원_예외() {
    Member member1 = new Member();
    member1.setName("son");

    Member member2 = new Member();
    member2.setName("son");

    memberService.join(member1);
    memberService.join(member2);

	Assert.fail("예외가 발생해야 한다."); // 이 메서드가 실행되면 테스트는 실패!
    }
  • expected 속성을 사용해 해당하는 Exception이 발생하면 테스트 성공
  • try-catch문을 사용하는 예외처리보다 코드가 훨씬 간결해졌음을 알 수 있다.

 

 

assertThrows 메서드 사용 ==> Junit5

Junit5에서는 @Test에 expected속성을 사용할 수 없다.

대신 예외처리를 위해 assertThrows 메서드를 사용하면 된다.

@Test
public void 중복회원_예외() {
    Member member1 = new Member();
    member1.setName("son");
    
    Member member2 = new Member();
    member2.setName("son");

    memberService.join(member1);
    assertThrows(IllegalStateException.class, () -> {
        memberService.join(member2);
    });
  • 람다식 형태로 예외가 발생할 실행문을 던져주면 된다.
  • 만약 예외가 발생하지 않으면 테스트는 실패한다.

 


테스트는 케이스 격리된 환경에서 실행하고, 끝나면 데이터를 초기화하는 것이 좋다.
메모리 DB를 사용하는 것이 가장 이상적이다.

추가로 테스트 케이스를 위한 스프링 환경과, 일반적으로 애플리케이션을 실행하는 환경은 보통 다르므로 설정 파일을 다르게 사용하자.
다음과 같이 간단하게 테스트용 설정 파일을 추가하면 된다.

  • 운영 로직은 main 내부의 코드들이 우선권을 가지지만 테스트에서는 test 내부의 코드들이 우선권을 가짐.
  • 즉, test/resources에 application.yml을 만들어놓으면 테스트를 할 때는 main의 application.yml이 무시되고 test의 application.yml이 실행.

 

  • 현재 사용하고 있는 h2 데이터베이스를 메모리모드로 설정하면 데이터베이스를 띄우지 않고도 테스트가 가능

 

스프링 부트는 datasource 설정이 없으면, 기본적을 메모리 DB를 사용하고, driver-class도 현재 등록된 라이브러를 보고 찾아준다.

추가로 ddl-auto 도 create-drop 모드로 동작한다. (create을 하고 마지막에 초기화)

따라서 데이터소스나, JPA 관련된 별도의 추가 설정을 하지 않아도 된다.

테스트만을 위한 설정을 할 수 있기 때문에 엄청난 이점이 있다.

 

 

테스트를 진행할 때는 test/resource/application.yml을 만들어 테스트용 파일 설정해두자!! 

반응형

'Spring > SpringBoot_JPA' 카테고리의 다른 글

API 개발 기본  (0) 2021.05.26
변경 감지와 병합(merge)  (0) 2021.05.24
엔티티 설계 주의점  (0) 2021.05.18
도메인 모델, 테이블 설계  (0) 2021.05.17
JPA, DB 설정 + 간단한 테스트  (0) 2021.05.16