Skip to main content

Command Palette

Search for a command to run...

[JUnit] 테스트시 예외를 기대하는 방법

Updated
[JUnit] 테스트시 예외를 기대하는 방법
K

backend developer interested in technical problem

예외를 기대하는 세 가지 방법

간단한 경우를 알아보자. 통장에 잔고보다 많은 돈을 인출하려고 하면 Account 코드는 예외를 던져야 한다.

단순한 방식 : 어노테이션 사용

JUnit의 @Test 어노테이션은 기대한 예외를 지정할 수 있는 인자를 제공한다.

@Test(expected=InsufficientFundsException.class)
public void thorwsWehnWithdrawingTooMuch(){
    account.withdraw(100);
}

해당 메서드를 실행할 때 InsufficientFundsException 예외가 발생하면 테스트는 통과한다.

옛날 방식 : try/catch와 fail

try/catch 블록을 사용할 수도 있다. 예외가 발생하지 않으면 fail() 메서드를 호출해 강제로 실패한다

try{
    account.withdraw(100);
    fail();
}
catch(InsufficientFundsException e){
    assertThat(e.getMessage(), equalTo("balance is not enough"));
}

위와 같은 방식은 예외가 발생한 후 어떤 상태를 검사할 때 유용하다. 위 코드에서는 메시지를 확인했다.

새로운 방식 : ExpectedExeption

ExpectedExeption 규칙은 예외를 검사하는데 있어 위의 두 가지 방식의 좋은 점만 모았다.

ExpectedExeption을 사용하려면 테스트 클래스에 Expected Exeption 인스턴스를 public으로 선언하고 @Rule 어노테이션을 달아준다. 아래는 예시다

import org.junit.rules.*;
...
@Rule
public ExpectedExeption thrown = ExpectedExeption.none();

@Test
public void exceptionRule(){
    thrown.expect(InsufficientFundsException.class);
    thrown.expectMessage("balance is not enough"); // 올바른 영어 표현인지는 모르겠음 ㅋ

    account.withdraw(100);
}
  • 테스트 셋업 단계에서 나머지 테스트를 실행할 때 발생할 수 있는 일을 알린다.
  • thrown 규칙 인스턴스는 InsufficientFundsException 이 발생함을 알려준다
  • 예외 객체에 적절한 메시지가 포함되어 있는지 검사하길 원하여 thrown 규칙에 따른 기대 사항을 지정한
  • 예외가 발생하길 바라는 테스트 실행 부분(withdraw 메서드를 호출해 자금을 인출하는 부분)을 실행한다

예외무시

자바는 검증된 예외(checked Exception)를 처리하도록 우리를 괴롭힌다 0.0

예외를 무시하려면 try/catch 블록을 넣지 말고 대신 발생하는 예외를 다시 던진다

@Test
public void readsFromTestFile() throws IOException{
    String filename = "test.txt";
    BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
    writer.write("test test test");
    writer.close();
    //...
}
3 views

More from this blog

rfc 959 읽어보면서 ftp이해하기

들어가며 프로젝트에서 FTP를 통해 파일을 전송하는 클라이언트를 개발했을 때 이야기입니다. 프로토콜에 대한 이해 없이 개발을 진행하다 보니 불필요하게 시간을 소모한 경험이 있어서 RFC 원문을 읽어보게 되었습니다. 읽게 된 계기 당시 FTP 프로토콜에 대한 이해가 부족한 상태로 개발을 시작했습니다. '제어를 위한 포트와 데이터 전송을 위한 포트가 분리되어 있다' 정도만 알고 있었고 Active 모드와 Passive 모드의 차이를 제대로 이해...

Dec 5, 20256
rfc 959 읽어보면서 ftp이해하기

mapstruct 로 보일러플레이트 코드 줄이기

배경 사내에서 교통 모니터링용 레이더 디바이스를 관리하는 API를 개발했을때 이야기입니다. 반복되는 코드에서 느꼈던 피로를 개선하고자 mapstruct를 적용해봤습니다. 실황 우선 일부 필드만 추출한 Device에 대해 간단히 이야기해야할 것 같습니다. 교통 모니터링용 레이더 디바이스로 신호등이나 가로등에 설치하며 설치된 좌표를 기록하는 위도, 경도와 레이더가 바라보는 방향을 의미하는 heading_angle필드 등이 있습니다. public...

Nov 13, 20259
mapstruct 로 보일러플레이트 코드 줄이기
T

takoyakisoba

38 posts