우리가 작성해야 하는 테스트 코드 비단 성공하는 케이스뿐만이 아니다.
실패하는 케이스와 발생할 수 있는 여러 예외들에 대한 처리 또한 테스트가 분명 중요한 부분인데, 오늘은 JUnit와 Mockito를 사용한 테스트 코드 작성 시에 사용 가능한 예외 처리 기법에 대해 비교해보고자 한다.
✔️ @Test
@Test(expected = NumberFormatException.class)
public void CalculateValues_test() {
.
.
.
}
Test 어노테이션의 expected를 사용한 예외 처리는 JUnit 프레임워크 자체에서 지원하는 예외 테스트 방법이다.
어노테이션에 미리 지정해둔 예외가 해당 테스트 메서드에서 발생하면 테스트가 성공한 것으로 간주하는데,
여기서 문제가 발생한다.
예외 발생 시점이나 위치와 무관하게 해당 메서드 내에서 해당 예외가 발생하기만 하면 테스트 메서드가 성공한 것으로 표시되기 때문이다.
이는 테스트 코드가 1-2줄 정도로 적어 예외 처리 시점을 신경 쓸 필요가 없는 간단한 테스트 코드 작성시에만 사용해야 하는 방법이다.
✔️ assertThrows
@Test
public void MyTest_test() {
Exception exception = assertThrows(IllegalArgumentException.class, () -> {
System.out.println("INCEPTION");
});
assertEquals("I'm not an exception", exception.getMessage());
}
assertThrows는 JUnit5 + Java8 이상에서 사용 가능한 방법이다.(람다가 있는것부터 8 쓰라는 어필)
발생한 예외를 리턴하므로 변수로 관리가 가능하여 테스트 코드 작성 시 자주 쓰인다.
✔️ doThrow
내가 테스트 코드를 작성할 때 JUnit/Kotest와 짝꿍으로 사용하는 프레임워크가 바로 Mockito/Mockk이다.
테스트 코드 작성에는 99%의 사람들이 Mock 객체를 사용해야하는 경우에 직면하며, 위 두 라이브러리들은 Mock 객체 생성을 도와주는 프레임워크이다.
doThrow는 그 중에서 Mockito가 지원하는 기능인데, 우리가 void 메서드를 테스트할 때 주로 사용하는 doAnswer나 doNothing의 자매품이라고 생각하면 된다.
@Mock
MyObject myObject
@Before
public void setUp() {
MockitoAnnotations.openMocks(this);
}
public void MyTest_test() {
.
. . .
doThrow(new NumberFormatException()).when(myMockObject).calculate(100, 15a);
}
위처럼 Stubbing시의 예외를 처리하는데에 주로 사용하는 방법이다.
무지성 throw만큼이나 위험한 것이 아무거나 막 가져다가 쓰는 것이다.
예외 처리에 대한 테스트는 다른 성공/실패 테스트보다 중요한 경우가 많기 때문에 무지성 expected는 피해야한다.
최근에 사이드 프로젝트에 Kotest를 도입해서 사용중인데, 와 JUnit 왜 씀 이라는 말이 절로 나온다.
예외 처리도 shouldThrow 갓. 코틀린 갓.
코틀린쪽 진영 스킬들을 공부하면서 오랜 시간을 함께한 자바를 정말 놔줘야겠다는 생각이 점점 커진다.
사요나라 자바..
'개발 > Kotlin' 카테고리의 다른 글
[Kotlin] 테스트 코드 (2) - TDD/BDD와 디자인 패턴 (0) | 2023.07.02 |
---|---|
[Kotlin] 테스트 코드 (1) - 테스트 코드란? (0) | 2023.06.28 |
Singleton 패턴이란? (0) | 2022.12.01 |
연산자 개수에 따른 차이(&, |와 &&,||의 차이) (0) | 2022.07.25 |
Serializable Parcelable 차이 (0) | 2022.02.22 |