⚡ 생각대로 살지 않으면 사는대로 생각한다.
⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.
아까 ValueSource에 다른 매개변수를 넣으려고 요래조래 바꿔봤지만, 안 되던 이유가 있었다... 영어로 나오는 메세지가, 하나만 들어간다는 뜻인가 하고 넘겼는데,,, @CvsSource라는 애너테이션에 여러 개의 인자를 들어가게 할수 있다고 한다.
@CvsSource
CSV (Comma Seperated Value) 형식의 데이터로 테스트를 반복한다.
애너테이션 설명 @EmptySource 비어있는 문자열을 인자로 하나 더 추가해준다. @NullSource null 값을 인자로 하나 더 추가해준다. @NullAndEmptySource @EmptySource + @NullSource 한 결과.
소스코드를 보니 @NullSource와 @EmptySource가 메타 애너테이션 형식으로 들어가있다.
이 세개의 애너테이션이 같이 선언되어 있으면, 중복된 부분은 제외된 결과가 나온다@EnumSource enumeration(열겨형) 값의 배열을 테스트 메서드에 전달한다.
test method 실행 당 하나의 인수(argument) 만을 전달할 때 사용할 수 있다.@MethodSource test method 실행시 복잡한 인수를 전달할 때 사용하는 방법
@MethodSource 에 설정하는 이름은 존재하는 메서드 이름이어야 한다.
이름을 설정하지 않으면 JUnit은 test method와 이름이 같은 source method를 찾는다.
테스트 메소드의 인자가 2개 이상인 경우 arguments를 사용해서 리턴해줘야합니다.@ArgumentSource 다른 어노테이션처럼 정해진 데이터 주입 방법말고 커스텀하게 주입 데이터 값을 정할 수 있는 어노테이션 @CvsFileSource .cvs 파일을 읽어서 테스트할 수 있게 해주는 어노테이션
테스트 중에 인자값으로 내가 Custom한 타입으로 변환값을 받고싶다면.. 물론,
인자값의 타입을 변환해주는 인터페이스가 있다.
참고 링크 =>> 암묵적인 타입변환
만약에 내가 만든 타입으로 변환을 받고 싶다면, SimpleArgumentConverter를 상속해서 구현해주면 된다.
일단 Study의 코드는 이렇다.
@ValueSource값으로 ints를 선언한 후에, int값을 받아서 Study로 인자값을 받으려면, SimpleArgumentConverter를 상속해서 구현한 클래스를 만들고, 테스트 메서드의 매개변수로, 어떤 클래스인지를 알려주는 @ConvertWith 애너테이션을 사용해서, 내가Custom한 타입(여기선 Study타입)을 매개변수로 받는다.💡SimpleArgumentConverter은 하나의 인자만 다른 타입으로 변환할 떄 적용하는게 ArgumentConverter이다.
Study 클래스에 몇 가지의 코드를 더 추가하고,
여러 인자 값을 받을 수 있는 @CsvSource애너테이션을 이용해서, 테스트 메서드에 값을 집어넣게 할 수도 있다.
값중 문자열이 있고, 그 문자열 중간에 공백이 있으면 홑따옴표를 이용해서 값을 지정할 수 있다.
이런 식으로..
ArgumentsAccessor
- 인자 값들을 조합해서 하나의 인자로 받아주는 기능을 하는 클래스이다.
- ArgumentsAccessor를 매개변수로 사용하면, ArgumentsAccessor 타입 매개변수가 @CsvSource에 해당하는 인자 값에 접근해서 값들을 받아와서 타입별 Getter의 메서드와 인덱스를 사용하면, 받아오는 인자 값들을 조합해야할 때, 보다 수월해진다.
이런 식으로 사용가능하다.
@AggregateWith
위의 내용에서 좀 더 과정을 줄이고 싶다면, @AggregateWith 애너테이션을 사용하면 된다.
- ArgumentsAggregator 인터페이스를 구현하는 Aggregator용 Custom 클래스를 구현해서, @CsvSource의 값들에 접근하도록 메서드를 구현하고,
테스트 메서드의 매개변수에 어떤 Aggregator 클래스에 접근할 것인지 @AggregateWith애너테이션을 이용하여 클래스를 지정해준다.
※ 주의! 다만 Aggregator에 대한 제약조건이 한 가지 있다.
이 클래스를 사용하기 위해선 인터페이스를 구현한 클래스가 static Inner 클래스이거나, public 클래스여야만 한다.
표의 애너테이션 참고 링크.
@EnumSource, @MethodSource, @CvsSource
@CvsFileSource, @ArgumentSource
-끝-