@ParameterzedTest, @EnumSource

yookyungmin·2023년 9월 26일
0

코드랩에서 계층별 테스트 코드를 작성하며 개발 진행을 할때 사용했던 어노테이션 중 두가지를 블로그 포스팅해 보려고 합니다.

코드부터 보여드리겠습니다

Domain

 public void proceed() {
        check(status == OPENED);

        this.status = IN_PROGRESS;
    }

 public void open(StudyPeriod period) {
        require(nonNull(period));

        check(CAN_OPEN_STATUSES.contains(status));

        this.period = period;
        this.status = OPENED;
    }

해당 코드는 Study라는 도메인의 일부 메서드 코드입니다.

Enum class

public enum StudyStatus {
    OPENED,
    IN_PROGRESS,
    CLOSED,
    DELETED;

    public final static Set<StudyStatus> CAN_OPEN_STATUSES = Set.of(IN_PROGRESS, CLOSED);
    public final static Set<StudyStatus> CAN_CLOSED_STATUSES = Set.of(IN_PROGRESS, OPENED);
    public final static Set<StudyStatus> CAN_DELETE_STATUSES = Set.of(IN_PROGRESS, OPENED, CLOSED);
}

Study의 상태를 나타내기 위해 Enum 클래스를 사용하였습니다.

테스트 코드

	@ParameterizedTest
    @EnumSource(value = StudyStatus.class, names = {"OPENED"}, mode = EXCLUDE)
    void 스터디_진행_실패__상태가_오픈이_아님(StudyStatus status) {
        study.setStatus(status);

        assertThatIllegalStateException().isThrownBy(() -> study.proceed());
    }

    @ParameterizedTest
    @EnumSource(value = StudyStatus.class, names = {"CLOSED", "IN_PROGRESS"}, mode = INCLUDE)
    void 스터디_오픈_성공(StudyStatus status) {
        study.setStatus(status);

        StudyPeriod period = StudyPeriod.create(OffsetDateTime.now(), OffsetDateTime.now().plusMinutes(10));

        study.open(period);

        assertThat(study.getStatus()).isEqualTo(OPENED);
    }


@ParameterizedTest

  • 어노테이션은 특정 테스트 메서드를 매개변수화된 테스트로 만들기 위해 사용됩니다.

@EnumSource

  • 어노테이션은 JUnit 5에서 열거형(enum) 값을 사용하여 매개변수화된 테스트를 작성하는 데 사용됩니다. 이 어노테이션을 사용하면 열거형에서 정의된 상수들을 테스트 메서드에 전달하여 여러 테스트 케이스를 생성할 수 있습니다.
  • @EnumSource(value = StudyStatus.class, names = {"CLOSED", "IN_PROGRESS"}, mode = INCLUDE)

value는 enum클래스를 입력하고 mode include, exclude 중 포함하거나 포함하지 않을 값을 name에 입력을 합니다.
스터디 오픈 성공으로 예를 들면 "CLOSED", "IN_PROGRESS" 일 때 스터디 오픈이 가능하다는 의미입니다.

0개의 댓글