테스트/0+ JUnit

[JUnit5] 테스트 인자 값 타입 변환하는 방법

힘들면힘을내는쿼카 2023. 5. 17. 20:41
728x90
반응형

 

[JUnit5] 테스트 인자 값 타입 변환하는 방법

https://korean.alibaba.com/product-detail/AC-DC-SMPS-Dual-48V-12V-60782572009.html

인자 값 타입 변환

JUnit에서는 인자값을 타입 변환하여 테스트를 할 수 있습니다.
종류로는 암묵적인 타입 변환이 있고, 명시적인 타입 변환이 있습니다.
명시적인 타입변환은 우리가 커스텀하게 사용하여 타입변환을 한다는 의미 입니다.

 

먼저 테스트에 사용할 Study 클래스 입니다.

@Data
public class Study {

    private StudyStatus status;
    private int limit;
    private String name;

    public Study(int limit) {
        this.status = StudyStatus.DRAFT;
        if(limit < 0) {
            throw new IllegalArgumentException("limit은 0보다 작습니다.");
        }
        this.limit = limit;
    }

    public Study(int limit, String name) {
        this.limit = limit;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Study{" +
                "limit=" + limit +
                ", name='" + name + '\'' +
                '}';
    }
}

 

암묵적 타입 변환

@DisplayName("반복테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(strings = {"안녕하세요", "여러분", "지금부터", "춤을 추며 놀아요"})
@NullAndEmptySource
void parameterizedTestWithNullAndEmpty(String message) {
    System.out.println(message);
}

 

 

 

명시적 타입 변환(인자 1개)

명시적 타입 변환을 하기 위해서는 SimpleArgumentConverter를 상속받아 구현하면 됩니다.

@DisplayName("반복테스트")
@ParameterizedTest(name = "{index} {displayName} message={0}")
@ValueSource(ints = {10, 20, 30})
void parameterizedTest1(@ConvertWith(StudyConverter.class) Study study) {
    System.out.println(study.getLimit());
}

// SimpleArgumentConverter을 상속받아 컨버터 구현
static class StudyConverter extends SimpleArgumentConverter {
    @Override
    protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException {
        // targetType이 Study.class
        Assertions.assertEquals(Study.class, targetType, "Can Only convert to Study");
        return new Study(Integer.parseInt(source.toString()));
    }
}

 

 

그런데 인자값을 여러개 받으려면 어떻게 해야할까요? 🤔

 

인자값 조합(인자 여러개)

ArgumentsAccessor를 이용하면 됩니다!!

@DisplayName("반복테스트")
@ParameterizedTest(name = "{index} {displayName}, message={0}")
@CsvSource({"10, ArgumentsAccessor 테스트", "20, 스프링"})
void parameterTestArgumentAccessor(ArgumentsAccessor argumentsAccessor) {
    Study study = new Study(argumentsAccessor.getInteger(0), argumentsAccessor.getString(1));
    System.out.println(study);
}

 

 

물론 커스텀하게 ArgumentsAggregator를 상속받아 구현할 수 있습니다.

@DisplayName("반복테스트")
@ParameterizedTest(name = "{index} {displayName}, message={0}")
@CsvSource({"100, StudyAggregator 테스트", "20, 스프링"})
void parameterTestArgumentAggregator(@AggregateWith(StudyAggregator.class) Study study) {
    System.out.println(study);
}

// ArgumentsAggregator을 상속받아 어그리게이터 구현
static class StudyAggregator implements ArgumentsAggregator {
    @Override
    public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) throws ArgumentsAggregationException {
        Study study = new Study(accessor.getInteger(0), accessor.getString(1));
        return study;
    }
}

 

 

참고

728x90
반응형