실행할 테스트 메소드 특정한 순서에 의해 실행되지만 어떻게 그 순서를 정하는지는 의도적으로 분명히 하지 않는다. (테스트 인스턴스를 테스트 마다 새로 만드는 것과 같은 이유)
경우에 따라, 특정 순서대로 테스트를 실행하고 싶을 때도 있다. 그 경우에는 테스트 메소드를 원하는 순서에 따라 실행하도록 @TestInstance(Lifecycle.PER_CLASS)와 함께 @TestMethodOrder를 사용할 수 있다.
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
// @TestInstance(TestInstance.Lifecycle.PER_CLASS) // Study Instance를 한 개만 만듬.
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // OrderAnnotation을 가지고 순서를 정해준다.
class StudyTest {
int value = 0;
@Order(2)
@FastTest
@DisplayName("스터디 만들기 Fast")
void create_new_Study() {
System.out.println(this);
System.out.println(value++);
Study actual = new Study(1);
assertThat(actual.getLimit()).isGreaterThan(0);
}
@Order(1)
@SlowTest
@DisplayName("스터디 만들기 slow")
void create1_new_study_again() {
System.out.println(this);
System.out.println("create1 " + value++);
}
// 아주 간단하게 테스트를 반복할 수 있다. 몇 번을 반복할지 적어주고, 테스트를 작성하면 된다.
@Order(3)
@DisplayName("스터디 만들기")
@RepeatedTest(value = 10, name = "{displayName}, {currentRepetition}/{totalRepetitions}")
void repeatTest(RepetitionInfo repetitionInfo) {
System.out.println("test" + repetitionInfo.getCurrentRepetition() + "/" +
repetitionInfo.getTotalRepetitions());
}
// 반복적인 테스트를 할 때마다, 다른 값들을 가지고 테스트틀 하고싶다.
@Order(4)
@DisplayName("스터디 만들기")
@ParameterizedTest(name = "{index} {displayName} message = {0}")
@CsvSource({"10, '자바스터디'", "20, 스프링"})
void parameterizedTest(@AggregateWith(StudyAggregator.class) Study study) {
System.out.println(study);
}
// 반드시 static inner 클래스거나 public여야 한다.
static class StudyAggregator implements ArgumentsAggregator {
@Override
public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) throws ArgumentsAggregationException {
return new Study(accessor.getInteger(0), accessor.getString(1));
}
}