JUnit5 - 테스트 반복하기2

현시기얌·2021년 8월 31일
0

JUnit5

목록 보기
7/8

인자값들의 소스

  • @ValueSource
  • @NullSourece, @EmptySource, @NullAndEmptySource
    @DisplayName("ParameterizedTest")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @ValueSource(strings = {"날씨가", "많이", "풀리고", "있네요."})
    @EmptySource
    @NullSource
    void parameterizedTest2(String message) {
        System.out.println(message);
    }

  • @EnumSource
  • @MethodSource
  • @CvsSource
  • @CvsFileSource
  • @ArgumentSource

인자 값 타입 변환

  • 암묵적인 타입 변환
  • 명시적인 타입 변환
    • SimpleArgumentConverter 상속 받은 구현체 제공
    • @ConvertWith
    • Arguement가 1개일 때 사용 가능
    @DisplayName("ParameterizedTest")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @ValueSource(ints = {10,20,40})
    void parameterizedTest3(@ConvertWith(StudyConverter.class) Study study) {
        System.out.println(study.getLimit());
    }

    public static class StudyConverter extends SimpleArgumentConverter {

        @Override
        protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
            assertEquals(Study.class, targetType, "Study 객체로만 변환 가능");
            return new Study(StudyStatus.ENDED, Integer.parseInt(source.toString()));
        }
    }

SimpleArgumentConverter를 상속받은 StudyConverter를 만든 후 @ConvertWith(StudyConverter.class)를 지정해주면 Study 객체로 타입 변환이 가능하다.

인자 값 조합

  • ArgumentsAccessor
  • 커스텀 Accessor
    • ArgumentsAggregator 인터페이스 구현
    • @AggregateWith

1. 객체를 직접 생성하는 경우

    @DisplayName("ParameterizedTest")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @CsvSource({"홍길동, 100", "아아아,200"})
    void parameterizedTest4(String name, Integer age) {
        final Person person = new Person(name, age);
        System.out.println(person);
    }

2. ArguementAccessor를 사용하여 객체를 생성하는 경우

  @DisplayName("ParameterizedTest")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @CsvSource({"홍길동, 100", "아아아,200"})
    void parameterizedTest5(ArgumentsAccessor argumentsAccessor) {
        final Person person = new Person(argumentsAccessor.getString(0), argumentsAccessor.getInteger(1));
        System.out.println(person);
    }

3. ArgumentsAggregator를 구현한 후 @AggregateWith 애노테이션을 사용한 경우 (객체 생성X)

    @DisplayName("ParameterizedTest")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @CsvSource({"홍길동, 100", "아아아,200"})
    void parameterizedTest5(@AggregateWith(PersonAggregator.class) Person person) {
        System.out.println(person);
    }

    public static class PersonAggregator implements ArgumentsAggregator {

        @Override
        public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) throws ArgumentsAggregationException {
           return new Person(accessor.getString(0), accessor.getInteger(1));

        }
    }

cf) ArguementsAggregator의 제약 조건

반드시 public 이거나 InnerClass에서 static 이어야한다.

profile
현시깁니다

0개의 댓글