오늘은 JUnit5으로 Enum을 테스트할 수 있는 방법들을 소개해볼까 합니다.
저는 @ParameterizedTest 애노테이션을 사용해서 Enum 값을 검증하는 테스트 코드를 작성하곤 합니다.
우선 이 애노테이션 없이 테스트 하는 코드를 먼저 보여드리겠습니다.
무지개색 타입의 Enum이 맞는지를 판별하는 static 메소드를 가진 Enum 클래스입니다.
(예시는 좀 그렇지만,,, 이해를 돕기 위해 좀 쉬운 예제를 가져왔습니다!)
테스트 코드에서는 빨강(RED)과 노랑(YELLOW)은 무지개색이지만, 검정(BLACK)은 무지개색이 아닌 것을 검정하려고 합니다.
저는 하나의 테스트 코드에 if문과 같이 분기문 사용하여 한 번에 여러 값을 검증하기 보다 하나의 테스트코느는 하나의 값을 검증하는 것이 좋다고 생각합니다. 안그러면 그 여러 값을 검증하는데에 맥락을 모두 읽어보며 파악해야 하기 때문입니다.
아래처럼 각 enum의 값이 무지개 색인지를 테스트 할 수 있습니다. 그런데 enum의 갯수가 많아질 수 도 있는데 이렇게 그 개수만큼 테스트가 늘어나면 길어지고 불편하지 않을까요??
class RainbowTypeTest {
@DisplayName("무지개 색상 관련 타입인지를 체크한다.")
@Test
void isRainbowColor1() {
// given
RainbowType givenType = RainbowType.RED;
// when
boolean result = RainbowType.isRainbowColor(givenType);
// then
assertThat(result).isTrue();
}
@DisplayName("무지개 색상 관련 타입인지를 체크한다.")
@Test
void isRainbowColor2() {
// given
RainbowType givenType = RainbowType.YELLOW;
// when
boolean result = RainbowType.isRainbowColor(givenType);
// then
assertThat(result).isTrue();
}
@DisplayName("무지개 색상 관련 타입인지를 체크한다.")
@Test
void isRainbowColor3() {
// given
RainbowType givenType = RainbowType.BLACK;
// when
boolean result = RainbowType.isRainbowColor(givenType);
// then
assertThat(result).isFalse();
}
}
이젠 위와 같은 테스트를 좀 더 편리하게 검증하게 해줄 수 있는 @ParameterizedTest를 사용하는 방법입니다. @CsvSource를 함께 사용하여, 각 타입의 expected(예상되는) 값을 컴마로 구문하여 아래처럼 작성할 수 있습니다.
@DisplayName("무지개 색상 관련 타입인지를 체크한다.")
@CsvSource({"RED,true","YELLOW,true","BLACK,false"})
@ParameterizedTest
void containsStockType4(RainbowType rainbowType, boolean expected) {
// when
boolean result = RainbowType.isRainbowColor(rainbowType);
// then
assertThat(result).isEqualTo(expected);
}
@CsvSource 말고도 @MethodSource라는 것도 있습니다.
이건 애노테이션 이름처럼 매소드를 통해 체크하는 방법입니다. 저는 보통 Enum의 갯수가 좀 많다싶으면 아래 방식처럼 테스트를 작성합니다.
테스트할 enum의 타입 리스트를 Stream.of()로 반환하는 given 역할의 메소드를 만들고요.
그 메소드의 이름이 동일하게 @MethodSource("메소드명")에 지정해주면 됩니다.
private static Stream<Arguments> rainbowTypesForCheckingIsRainbowColor() {
return Stream.of(
Arguments.of(RainbowType.RED, true),
Arguments.of(RainbowType.YELLOW, true),
Arguments.of(RainbowType.BLACK, false)
);
}
@DisplayName("무지개 색상 관련 타입인지를 체크한다.")
@MethodSource("rainbowTypesForCheckingIsRainbowColor")
@ParameterizedTest
void containsStockType5(RainbowType rainbowType, boolean expected) {
// when
boolean result = RainbowType.isRainbowColor(rainbowType);
// then
assertThat(result).isEqualTo(expected);
}
여기까지 Enum 값들을 테스트해볼 수 있는 방법들을 소개해봤구요.
사실 Enum이 아니어도 파라미터 값들을 이런 식으로 테스트 해봐도 됩니다.
좀 더 자세한 사용법이 궁금하시다면 공식 @Parameterized 에 관한 공식 JUnit5 공식문서를 참고하시기 바랍니다.
오늘의 포스팅 여기서 마치겠습니다. 감사합니다.
https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests