테스트를 작성하다보면 매개변수에 따라 반복이 되는 테스트들이 생긴다.
이 때 @ParameterizedTest
를 사용하면 단일 테스트를 매개변수를 사용하여 여러 번 반복할 수 있다.
Argument Sources
@ParameterizedTest
를 사용하려면 최소 하나 이상의 Source 애노테이션이 필요하다.
JUnit이 제공하는 다양한 Source가 있기 때문에, 테스트에 맞춰 다양하게 사용할 수 있다.
Value Source
값을 이용하여 제공하는 형태로, 다음과 같은 타입의 값을 매개변수로 제공할 수 있다.
- short, int, long, float, double
- byte, char, boolean, String, Class
@ParameterizedTest
@ValueSource(ints = {1, 100, Integer.MAX_VALUE})
void valueTest(final int value) {
Assertions.assertThat(value).isPositive();
}
Null & Empty Source
null 값, 빈 값을 제공한다.
Empty Source의 경우 다음과 같은 타입에 한해 매개변수로 제공할 수 있다.
- String
- java.util.List, java.util.Set, java.util.Map
- primitive arrays — ex) int[]
- object arrays — ex) String[]
@ParameterizedTest
@NullAndEmptySource
void nullAndEmptyTest(final String value) {
Assertions.assertThat(value).isNullOrEmpty();
}
Enum Source
EnumSource를 이용하여 Enum 또한 매개변수로 제공할 수 있다.
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
@ParameterizedTest
@EnumSource(Day.class)
void enumTest(final Day day) {
assertThat(day).isInstanceOf(Day.class);
}
다음과 같이 mode 값을 이용하여 특징 Enum을 제외하거나, 포함시킬 수 있다. (default: Mode.Include)
@ParameterizedTest
@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)
void enumTest(final Day day) {
// MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
assertThat(day).isInstanceOf(Day.class);
}
CSV Source
csv 형식의 값을 이용하여 매개변수를 제공한다.
구분자의 기본값은 쉼표(,)로 구분자를 변경하고 싶을 땐 delimeter 값을 따로 전달하여 사용할 수 있다.
개인적으로 2개 정도의 값을 매개변수로 전달하는 경우 CsvSource를 사용한다.
@ParameterizedTest
@CsvSource({"1,1", "2,4", "3,9", "4,16"})
void csvTest(final int number, final int result) {
assertThat(number * number).isEqualTo(result);
}
Method Source
복잡한 타입의 값을 전달할 때 사용한다.
메서드 명을 입력하여 매개변수를 제공하는 메서드를 지정할 수 있다.
메서드명을 따로 입력하지 않으면 테스트명과 동일한 static 메서드가 지정된다.
@ParameterizedTest
@MethodSource
void methodTest(final List<Integer> numbers, final int count) {
assertThat(numbers).hasSize(count);
}
private static Stream<Arguments> methodTest() {
return Stream.of(
Arguments.of(List.of(1), 1),
Arguments.of(List.of(1, 2), 2),
Arguments.of(List.of(1, 2, 3), 3)
);
}
ETC.
위에서 언급한 방법 이외에도 다양한 방법으로 매개변수를 제공할 수 있다.
- CSV 파일을 이용한 CsvFileSource
- ArgumentsProvider 구현한 클래스를 이용하는 ArgumentsSource