728x90
반응형
[JUnit5] 테스트 인자 값 타입 변환하는 방법
![](https://blog.kakaocdn.net/dn/bfcR0g/btsgkjdagu4/0vHyN3wxiBj5VXFTlOfO00/img.png)
인자 값 타입 변환
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);
}
![](https://blog.kakaocdn.net/dn/Jo1vT/btsgn1ocuXv/kJ1MGC3jiakEkVaZTEzZbk/img.png)
명시적 타입 변환(인자 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()));
}
}
![](https://blog.kakaocdn.net/dn/bQyaYT/btsgneBm6MB/9ZPQoHThkEspVHqd7kWX61/img.png)
그런데 인자값을 여러개 받으려면 어떻게 해야할까요? 🤔
인자값 조합(인자 여러개)
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);
}
![](https://blog.kakaocdn.net/dn/cXerLi/btsgnXTF7ih/pHHEDKmt2kchFo0jgn75TK/img.png)
물론 커스텀하게 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;
}
}
![](https://blog.kakaocdn.net/dn/oA653/btsgmFlFl9J/DRyw9fgnms1kBoyhgzr5u1/img.png)
참고
728x90
반응형
'테스트 > 0+ JUnit' 카테고리의 다른 글
[JUnit] 회원가입 API 컨트롤러, 서비스, 리포지토리 테스트 예제 (5) | 2023.06.09 |
---|---|
[JUnit5] 인스턴스 테스트와 테스트 순서대로 실행하는 방법 (0) | 2023.05.17 |
[JUnit5] 환경변수 조건에 따라 테스트 실행하는 방법 (0) | 2023.05.05 |
[JUnit5] Assertions 기본 사용법 (0) | 2023.05.05 |
[JUnit5] JUnit5 기본 어노테이션 (0) | 2023.05.04 |