JUnit5 @ParameterizedTest 에서 자주 쓰는
@MethodSource, @ValueSource, @CsvSource 의 차이
가장 간단한 파라미터 제공 방식.
예)
@ParameterizedTest
@ValueSource(strings = {"a", "b", "c"})
void test(String input) {
assertThat(input).isNotBlank();
}
✔ 장점: 매우 간단
✘ 단점: 여러 인자를 테스트할 수 없음
CSV(쉼표로 구분된 값)를 사용해
테스트 메서드 파라미터 여러 개 전달 가능.
예)
@ParameterizedTest
@CsvSource({
"1, 2, 3",
"4, 6, 10",
})
void plus_test(int a, int b, int expected) {
assertThat(a + b).isEqualTo(expected);
}
✔ 장점: 여러 인자를 손쉽게 넣을 수 있음
✔ 문자열도 가능
✘ 단점: 복잡한 데이터, 콤마 포함 문자열은 다루기 조금 귀찮음
메서드로부터 복잡한 객체, 리스트, 여러 인자 등 어떤 형태든 전달 가능.
@ParameterizedTest
@MethodSource("numberProvider")
void test(List<Integer> numbers, int expected) {
assertThat(numbers.stream().mapToInt(i -> i).sum())
.isEqualTo(expected);
}
static Stream<Arguments> numberProvider() {
return Stream.of(
Arguments.of(List.of(1,2,3), 6),
Arguments.of(List.of(4,4,2), 10)
);
}
✔ 장점:
✘ 단점:
@ValueSource예) 문자열이 유효한지 검사
예) 길이 체크, 숫자만 체크
@CsvSource예)
@MethodSource예)
너가 만든 NumberParser 테스트는 “리스트 반환 + 다양한 문자열 입력”이라서
@MethodSource가 최적이야.
@ValueSource는 단일 값,
@CsvSource는 여러 파라미터,
@MethodSource는 가장 자유도가 높아 복잡한 입력을 테스트할 때 사용한다.