[개발 기록] Junit5 - ValueSource, CsvSource, MethodSource
반복되는 테스트코드를 작성하기 위한 3가지 방법
ValueSource
단순 명확하고 반복되는 테스트 케이스에 사용했습니다. 인자로는 한가지 타입밖에 받지 못하기 때문에 유연한 테스트 케이스는 아닙니다.
public class SetCollectionTest {
private Set<Integer> numbers;
@BeforeEach
void setUp() {
numbers = new HashSet<>();
numbers.add(1);
numbers.add(1);
numbers.add(2);
numbers.add(3);
}
@DisplayName("값이 존재하는지 확인 - 성공 케이스")
@ParameterizedTest(name = "set has {0}? {1}")
@ValueSource(ints = {1,2,3})
void containsSuccess(int expected){
assertTrue(numbers.contains(expected));
}
}
CsvSource
actual과 expected가 동시에 존재할 때 사용했습니다. 인자를 2개까지 받을 수 있지만 인자에 클래스타입은 불가능합니다. 인자를 문자열 형태로 제공하기 때문입니다.
public class CsvSource {
@DisplayName("문자열에 원하는 위치 지정시 문자를 반환")
@ParameterizedTest(name = "{0}번째 문자는 {1}")
@CsvSource(value = {"0,a", "1,b", "2,c"})
void charAtSuccess(int index, char expected) {
String target = "abc";
char actual = target.charAt(index);
assertThat(actual).isEqualTo(expected);
}
}
MethodSource
결과 값에 단순한 값이 아닌 객체타입이 들어갈 때 사용했습니다. 테스트 메서드에 클래스 타입의 객체를 인자로 넘겨줄 수 있습니다.
public class MethodSource {
@DisplayName("콤마를 분리")
@ParameterizedTest(name = "\"{0}\" -> {1} ")
@MethodSource
void splitByComma(String target, String[] expected) {
//when
String[] split = target.split(",");
//then
assertThat(split).contains(expected);
}
private static Stream<Arguments> splitByComma() {
return Stream.of(
Arguments.of("1,2", new String[]{"1", "2"}),
Arguments.of("1", new String[]{"1"})
);
}
}
댓글남기기