인자 값들의 소스
-
@ValueSource
-
@NullSource, @EmptySource, @NullAndEmptySource
@DisplayName("스터디 만들기 2")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@ValueSource(strings = {"날씨가", "많이", "추워지고", "있습니다."})
@EmptySource
@NullSource
@NullAndEmptySource
void ParameterizedTest(String message) {
System.out.println(message);
}
-
@EnumSource
-
@MethodSource
-
@CvsSource
-
@CvsFileSource
-
@ArgumentSource
인자 값 타입 변환
-
암묵적인 타입 변환
-
레퍼런스 참고
1. valueSource로 Integer값을 받는다.
@DisplayName("스터디 만들기 2")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@ValueSource(ints = {10, 20, 40})
void ParameterizedTest(Integer limit) {
System.out.println(limit);
}
2. 이때 들어오는 Integer를 레퍼런스 타입으로 받는다.
@DisplayName("스터디 만들기 2")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@ValueSource(ints = {10, 20, 40})
void ParameterizedTest(Study limit) {
System.out.println(limit);
}
3. 이렇게 커스텀한 타입으로 변환하고 해서 파라미터를 받고 싶을 땐 SimpleArgumentConverter 상속받은 구현체를 사용한다.
static class StudyConverter extends SimpleArgumentConverter {
@Override
protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
assertEquals(Study.class, targetType, "Can only convert to Study");
return Integer.parseInt(source.toString());
}
}
4. @ConverWith를 사용하여 커스텀한 컨버터를 알려주어야 한다.
@DisplayName("스터디 만들기 2")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@ValueSource(ints = {10, 20, 40})
void ParameterizedTest(@ConvertWith(StudyConverter.class) Study limit) {
System.out.println(limit);
}
하지만 SimpleArgumentConverter는 하나의 Argument에 대해서만 적용이 가능하다.
그러므로
@DisplayName("스터디 만들기 2")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@CsvSource({"10, '자바 스터디'", "20, 스프"})
void ParameterizedTest(@ConvertWith(StudyConverter.class) Study limit) {
System.out.println(limit);
}
위와 같이 여러 개의 Argument를 받는 상황에선 다른 방안을 고안해야 한다.
1. 첫 번째 방법 : 객체를 이용하는 방법
@DisplayName("스터디 만들기 2")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@CsvSource({"10, '자바 스터디'", "20, 스프"})
void ParameterizedTest(Integer limit, String name) {
Study study = new Study(limit, name);
System.out.println(study);
}
2. 두 번째 방법 : ArgumentsAccessor의 사용
@DisplayName("스터디 만들기 2")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@CsvSource({"10, '자바 스터디'", "20, 스프링"})
void ParameterizedTest(ArgumentsAccessor argumentsAccessor) {
Study study = new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
System.out.println(study);
}
3. 세 번째 방법 : ArgumentsAggregator의 사용 - 객체를 밖으로 빼버린다.
이때 @AggregateWith로
@DisplayName("스터디 만들기 2")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@CsvSource({"10, '자바 스터디'", "20, 스프"})
void ParameterizedTest(@AggregateWith(StudyAggregator.class)Study study) {
// Study study = new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
System.out.println(study);
}
static class StudyAggregator implements ArgumentsAggregator {
@Override
public Object aggregateArguments(ArgumentsAccessor argumentsAccessor, ParameterContext parameterContext) throws ArgumentsAggregationException {
return new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
}
}
정리
Aggregator는 제약조건이 따른다.
- 반드시 static inner class 이어야 한다.
- public class 이어야 한다.
-
명시적인 타입 변환
-
SimpleArgumentConverter 상속받은 구현체 제공
-
@ConvertWith
인자 값 조합
-
ArgumentsAccessor
-
커스텀 Accessor
-
ArgumentsAggregator 인터페이스 구현
-
@AggregateWith
https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests
코드 참조
https://github.com/mike6321/PURE_JAVA/tree/master/HowToTest/inflearn-the-java-test
'Java > Test' 카테고리의 다른 글
(Test) JUnit 5 테스트 순서 (0) | 2019.12.31 |
---|---|
(Test) JUnit 5 테스트 인스턴스 (0) | 2019.12.30 |
(Test) JUit5 테스트 반복하기(1) (0) | 2019.12.30 |
(Test) JUit5 커스텀 태그 (0) | 2019.12.30 |
(Test) JUnit 5 태깅과 필터링 (0) | 2019.12.30 |