Spock 프레임워크의 @Unroll과 where 절 사용하기

2025. 3. 4. 17:29· 테스트/Spock
목차
  1.  
  2. 1. 문제 상황
  3. 2. 테스트 코드 작성
  4. 3. @Unroll의 역할
  5. 4. @Unroll 을 활용해 가독성 높이기
  6. 4. 결론
  7.  
  8. References

 

1. 문제 상황

 

최근 프로젝트에서 Role 이라는 Enum 클래스를 만들면서 of 메서드를 추가하게 되었다. 

이 메서드는 문자열 입력값을 받아 Enum 값을 반환하는 역할을 한다.

 

package com.griotold.auth.domain.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum Role {
    MASTER("ROLE_MASTER"),
    HUB("ROLE_HUB"),
    DELIVERY("ROLE_DELIVERY"),
    COMPANY("ROLE_COMPANY");

    private final String role;

    public static Role of(String request) {
        if (request == null) {
            return null;
        }

        return switch (request.toUpperCase()) {
            case "MASTER" -> MASTER;
            case "HUB" -> HUB;
            case "DELIVERY" -> DELIVERY;
            case "COMPANY" -> COMPANY;
            default -> null;
        };
    }
}

 

 

여기서 핵심은 대소문자 구분 없이 문자열이 들어와도 올바른 Role Enum 값을 반환해야 한다는 점이었다.

현 프로젝트는 Spock 이라는 테스트 프레임워크를 사용하고 있다.

 

2. 테스트 코드 작성

 

of 메서드가 올바르게 동작하는지 테스트 코드를 작성해보자.

특히, 여러 입력값을 한 번에 테스트하기 위해 where: 절을 사용했다.

 

package com.griotold.auth.domain.enums

import spock.lang.Specification
import spock.lang.Unroll

class RoleTest extends Specification {

    @Unroll
    def "of 메서드가 대소문자 상관없이 올바른 Role을 반환해야 한다"() {
        expect:
        Role.of(input) == expectedRole

        where:
        input      || expectedRole
        "MASTER"   || Role.MASTER
        "master"   || Role.MASTER
        "MaStEr"   || Role.MASTER
        "HUB"      || Role.HUB
        "hub"      || Role.HUB
        "Hub"      || Role.HUB
        "DELIVERY" || Role.DELIVERY
        "delivery" || Role.DELIVERY
        "COMPANY"  || Role.COMPANY
        "company"  || Role.COMPANY
    }

    @Unroll
    def "of 메서드가 유효하지 않은 입력값에 대해 null을 반환해야 한다"() {
        expect:
        Role.of(input) == null

        where:
        input << [null, "", "INVALID", "123", "ROLE_MASTER"]
    }
}

 

3. @Unroll의 역할

테스트 코드를 작성하면서 @Unroll 어노테이션을 처음 접했다.

처음에는 없어도 테스트가 정상 실행되었기 때문에 큰 차이를 느끼지 못했다.

하지만 @Unroll을 사용하면 테스트 실행 결과에서 개별 입력값이 명확하게 출력되며,

실패 시 어떤 값에서 문제가 발생했는지 바로 확인할 수 있다.

예를 들어, @Unroll을 적용한 테스트 실행 결과는 다음과 같다.

 

4. @Unroll 을 활용해 가독성 높이기

 

@Unroll에 문자열을 추가하면, Test Results 의 가독성을 높일 수 있다.

 

package com.griotold.auth.domain.enums

import spock.lang.Specification
import spock.lang.Unroll

class RoleTest extends Specification {
    
    // 문자열 추가!
    @Unroll("입력값 #input 일 때, 예상 결과는 #expectedRole 이어야 한다")
    def "of 메서드가 대소문자 상관없이 올바른 Role을 반환해야 한다"() {
        expect:
        Role.of(input) == expectedRole

        where:
        input      || expectedRole
        "MASTER"   || Role.MASTER
        "master"   || Role.MASTER
        "MaStEr"   || Role.MASTER
        "HUB"      || Role.HUB
        "hub"      || Role.HUB
        "Hub"      || Role.HUB
        "DELIVERY" || Role.DELIVERY
        "delivery" || Role.DELIVERY
        "COMPANY"  || Role.COMPANY
        "company"  || Role.COMPANY
    }
    
    // 문자열 추가!
    @Unroll("입력값 #input 일 때, 예상 결과는 null 이어야 한다")
    def "of 메서드가 유효하지 않은 입력값에 대해 null을 반환해야 한다"() {
        expect:
        Role.of(input) == null

        where:
        input << [null, "", "INVALID", "123", "ROLE_MASTER"]
    }
}

 

위 처럼, 문자열을 추가하면 좀 더 가독성을 높일 수 있다.

 

4. 결론

 

Spock에서 where 절을 활용하면 여러 테스트 케이스를 깔끔하게 작성할 수 있고,

@Unroll을 사용하면 실행 결과를 더욱 직관적으로 확인할 수 있다.

앞으로도 데이터 기반 테스트를 작성할 때 적극 활용할 계획이다.

 

References

 

https://blog.leocat.kr/notes/2019/05/01/spock-unroll-the-parameterized-tests#google_vignette

 

 

  1.  
  2. 1. 문제 상황
  3. 2. 테스트 코드 작성
  4. 3. @Unroll의 역할
  5. 4. @Unroll 을 활용해 가독성 높이기
  6. 4. 결론
  7.  
  8. References
Griotold
Griotold
Griotold
Griotold's Olive Oil
Griotold
전체
오늘
어제
  • 분류 전체보기 (90)
    • 테스트 (4)
      • Spock (1)
      • Junit (3)
    • 디자인 패턴 (1)
    • 깃 (2)
    • 리팩토링 (4)
    • 항해플러스 백엔드 5기 (3)
    • 인프런 워밍업 클럽 스터디 2기 백엔드 (4)
    • 코딩테스트 (10)
    • 자바 심화 2기 (7)
    • 백엔드 면접 질문 (19)
    • 인프라 (17)
      • docker (5)
      • CI, CD (5)
      • Monitoring (6)
      • AWS (1)
    • 데이터베이스 (1)
      • Redis (1)
    • 메시지큐 (3)
      • rabbitMQ (0)
      • kafka (3)
    • MSA (7)
    • JPA (1)
    • Spring (5)
      • Spring AI (1)
    • GraphQL (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • githubactions
  • CICD
  • github
  • prometheus
  • 항해99
  • java
  • junit5
  • micrometer
  • 99클럽
  • 이분탐색
  • 개발자취업
  • MSA
  • 자바
  • grafana
  • docker
  • 읽기좋은코드
  • 백준
  • 백엔드
  • TIL
  • 코딩테스트준비
  • JPA
  • backend
  • 프로그래머스
  • 오블완
  • actuator
  • 티스토리챌린지
  • 배포
  • DATABASE
  • 리팩터링
  • Spring

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Griotold
Spock 프레임워크의 @Unroll과 where 절 사용하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.