본문 바로가기

Java/Test

(Test) JUit5 테스트 반복하기(2)

인자 값들의 소스

  • @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);
}

중간에  null  혹은 공백 삽입

  • @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

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus

junit.org

 

 

 

코드 참조

https://github.com/mike6321/PURE_JAVA/tree/master/HowToTest/inflearn-the-java-test

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

 

'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