Spock 란?

작성일

Spock 프레임워크란?

SpockGroovy 언어를 사용해서 테스트 코드를 작성는 프레임워크이다.

Spock는 다음과 같은 특징이 있다.

  • JUnit 과 비교하여 코드를 더 간결하게 작성 가능하다.
  • Groovy 언어는 JVM 위에서 동작하며 Java 문법과 유사하다.
  • 테스트 메서드 이름을 문자열로 작성할 수 있다.
  • given, when, then 코드 블록을 명확히 구분할 수 있다.

JUnit의 경우 주석으로 블록을 구분했었고, 메소드 이름 또한 제약사항이 많이 존재했다. 이를 개선한 것이 Spock이다.

JUnit vs Spock

기존에 JUnit을 사용해본 경험이 있다면 spock를 배우는 것이 어렵지 않을 것이다. JUnit에서 제공하는 주요 요소들은 모두 Spock에서 제공하고 있기 때문이다. 둘의 구성요소를 비교해보면 아래와 같다.

JUnit spock 의미
Test class extends Specification 테스트 클래스 자체
@Test method Feature 테스트 케서드
Assertion Condition 검증 내용
Mocking Interaction 거짓 객체와의 연동
@Before setup() 각 테스트 시작 할 때 마다, 한번 씩 수행 (테스트 초기화)
@After cleanup() 각 테스트 종료 할 때 마다, 한번 씩 수행 (테스트 정리)
@BeforeClass setupSpec() 테스트 클래스 시작 시 한번 만 수행
@AfterClass cleanupSpec() 테스트 클래스 종료 후 한번 만 수행

테스트 코드 작성 시 규칙

Spock 프레임워크 테스트 코드 작성 시 다음과 같은 규칙이 있다.

  • 테스트 클래스는 Groovy 클래스로 생성하고, Specification 클래스를 상속 받는다.
  • 테스트 메서드(feature)는 def를 이용하여 함수로 선언하며, 하나 이상 블록이 존재해야 한다.
  • given 블록 : 테스트에 필요한 값을 준비한다.
  • when 블록 : 테스트할 코드를 실행한다.
  • then 블록 : when과 함께 사용하며 예외 및 결과 값을 검증한다.
  • expect 블록 : then과 같으며 when을 필요로 하지 않기 때문에 간단한 테스트 및 where와 같이 사용된다.
  • where 블록 : 데이터가 다르고 로직이 동일한 경우 동일한 테스트에 대한 중복 코드 제거 가능하다.

아래 코드는 Spock로 테스트 코드를 작성한 예시이다.

@SpringBootTest
class KakaoUriBuilderServiceTest extends Specification {

    private KakaoUriBuilderService kakaoUriBuilderService;

    def setup() {
        kakaoUriBuilderService = new KakaoUriBuilderService()
    }

    def "buildUriByAddressSearch - 한글 파라미터의 경우 정상적으로 인코딩"() {
        given:
        String address = "서울 성북구"
        def charset = StandardCharsets.UTF_8

        when:
        def uri = kakaoUriBuilderService.buildUriByAddressSearch(address)
        def decodeResult = URLDecoder.decode(uri.toString(), charset)

        then:
        decodeResult == "https://dapi.kakao.com/v2/local/search/address.json?query=서울 성북구"
    }
}
  • def charset = StandardCharsets.UTF_8
    • 여기서 def는 동적 타입으로 생성한 것이다.

Spock 환경 설정

  1. Spock 플러그인 설치

    1

  2. build.gradle에 groovy 설정 추가

     plugins {
         id 'groovy' // groovy 지원
         id 'java'
         id 'org.springframework.boot' version '2.6.7'
         id 'io.spring.dependency-management' version '1.1.4'
     }
    
     dependencies {
         ...
            
         // spock
         testImplementation('org.spockframework:spock-core:2.1-groovy-3.0')
         testImplementation('org.spockframework:spock-spring:2.1-groovy-3.0')
        
         // 런타임에 클래스 기반 spock mock을 만들기 위해서 필요
         testImplementation('net.bytebuddy:byte-buddy:1.12.10')
     }
    
  3. test 폴더 밑에 groovy 폴더 생성

    4

  4. 테스트 코드 생성 시 Spock를 선택, 경로도 groovy를 선택한다.

    2

    3

[참고] Spock 공식 문서