예외 처리를 위해 Exception을 throw 하도록 코드를 작성하였다면, 테스트 코드를 통해 예외 처리가 정상 작동하는지, 정상 조건에서 예외를 throw하지는 않는지 확인할 필요가 있다.
이때 assertj를 활용하면 가독성있는 테스트 코드를 작성할 수 있다.
공백인 문자열을 확인하는 isBlank 메소드를 다음과 같이 작성하였다고 하면
public static void isBlank(String input) {
if (input.isEmpty()) {
throw new IllegalArgumentException(Messages.ERROR_IS_BLANK);
}
}
isBlank
는 IllegalArgumentException
예외를 throw한다. 이를 테스트하기 위해 assertj의 assertThatThrownBy
를 이용할 수 있다.
@Test
@DisplayName("입력이 공백인 경우 테스트")
void isBlankTest() {
String input = "";
assertThatThrownBy(() -> {
ValidationUtils.isBlank(input);
}).isInstanceOf(IllegalArgumentException.class)
.hasMessage(Messages.ERROR_IS_BLANK);
}
isInstanceOf
를 통해 throw된 에러의 인스턴스 타입을 지정할 수 있다. hasMessage
나 hasMessageContains
를 통해 에러 메시지에 관한 테스트를 추가할 수 있다.
위의 코드는 Java의 lambda식을 이용하면 다음과 같이 작성할 수 있다.
@Test
@DisplayName("입력이 공백인 경우 테스트")
void isBlankTest() {
String input = "";
assertThatThrownBy(() -> ValidationUtils.isBlank(input))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage(Messages.ERROR_IS_BLANK);
}
예외를 throw 하기로 작성된 메서드의 정상 작동을 확인하기 위해 예외를 throw하지 않고 실행되는 void 메서드를 테스트할 경우가 있다. 역시 assertj의 assertThatCode
를 이용할 수 있다.
assertThatCode(() -> ValidationUtils.isBlank("String"))
.doesNotThrowAnyException();