Right now do !

[JAVA] JUnit에서 예외 Test하기

by 지금당장해

 사실 정상 흐름만 테스트하기도 바쁜데 의도한 대로 예외가 발생했는지까지 테스트 하는 것이 낭비다 싶을 때도 있지만 곰곰히 생각 해보면 물리학에도 작용과 반작용이 있는것이고 모든일에는 정상적인 일처리가 있다면 만에 하나라도 생기는 예외라는 것이 존재하기 마련이다. 결국 단위테스트를 작성하는 개발자 입장에서는 어떤 조건에서는 오류가 날 수 밖에 없어라고 본인에 논리를 펴서 예외 처리를 해 놓았다면 이 또한 테스트의 대상이 되는 것은 자명한 사실이다. 

 가장 무식하게 접근하는 방법은 예외가 예상되는 코드를 해놓고 try...catch를 걸어서 catch 블럭에서 boolean을 하나 선언하여 이를 true로 설정하는 것이다. exceptionCatched쯤으로 해두자 그리고 이 값이 false즉 해당 블럭을 거치지 않았다면 테스트는 실패 한것이다. 명확하다.

boolean exceptionCatched = false;
try {
	// 여기에 오류 유발 코드를 구현한다.
} catch (ClassNotFoundException e) {
	exceptionCatched = true;
}
            
Assert.assertTrue(exceptionCatched);

 어느날 개미(하도 죽도록 일만 해서 소싯적에 내가 친구에게 지어준 별명)가 "excepcted 사용하지" 하는거다. 아 그래 이렇게 무식하게 하는 것이 아니고 뭔가 장치가 있었어 ... 그제야 뭔가 어딘선가 본거 같은 코드가 떠올랐다. 그래 맞다 @Test 어노테이션에 뭘 붙였었지... 그리고 아래 처럼 바꿔 봤다.

 

   @Test(expected = RuntimeException.class)
    public void testWithExpected() {

        // 블라 블라 예외가 발생할 만한 코드
    }

캬~ 얼마나 그래이스 플~ 해졌는가! 꼴도 보기 싫은 try ... catch문도 없이 깔끔하게 그래 그렇게 또 몇일을 테스트 코드를 작성하다가 또 가려운데가 생겼다. 같은 오류 Class인데 내부에 메시지만 좀 다른 상황에 대한 테스트를 분리해야 하는 상황이 생겼는데... 어쩌지... 단서는 그야 말로 오류메시지가 다른것 뿐인데... 찾아 봤다. 들어는 봤는가 @Rule이라고 이 Rule이라는 개념은 JUnit 4.7부터 가능하단다. 그러니 혹여 이 내용을 적용하고픈 독자는 메이븐 참조 버전 부터 확인해보시고 다시 돌아오시라. 필자는 확인해보니 4.10이라 패스....

암튼 이 Rule 이 기능만 있는 것은 아닌데 일단 내가 필요한것은 예외 메시지 까지 구별하고 싶은 욕구를 해결하는 것이니 오늘은 이것만 다루겠다. 사실 이것 밖에 몰라서 그런다.

 

 

@Rule
public ExpectedException expectedException = ExpectedException.none();

@Test
public void testWithExpectedException() {

    expectedException.expect(RuntimeException.class);
    expectedException.expectMessage("김수한무 거북이와 두루미");

    // 블라 블라 예외를 유발하는 코드
}

사실 어노테이션 옆에 딱 차고 들어간 모양이 더 간지가 나지만 어쩌겠는가!! 메시지를 구별 해야하는데.... 아참 그리고 메시지 다 안써도 된다. 대충 시작하는 내용이 맞으면 true 떨어지는 모양이다. 안 해봤으면 모를뻔 했다. 테스트 자동화의 꿈은 멀고도 험하다. 

블로그의 정보

지금 당장 해!!!

지금당장해

활동하기