Spock은 BDD(Behavior-Driven Development) 테스트 프레임 워크이다
Junit에 비해 문법이 좀더 직관적이고 반복적인 부분을 줄일 수 있다.
그리고, BDD를 문법의 블록으로 차용해서 적용할 수 있다
Groovy 문법을 사용한다

apply plugin: 'groovy'

testCompile "org.spockframework:spock-core:2.0-groovy-3.0"
testCompile "org.spockframework:spock-spring:2.0-groovy-3.0"

Specification

  • spock.lang.Specification 클래스를 상속 받아 Spock 테스트 클래스를 선언
class MyFirstSpecification extends Specification {
  // fields
  // fixture methods
  // feature methods
  // helper methods
}

Fixture Method

  • 라이프사이클과 관련된 메서드

  • setupSpec() : 모든 테스트 전에 실행될 메서드 명시(테스트 클래스 수행시 1번만 실행) @BeforeAll
  • cleanSpec() : 모든 테스트 후에 실행될 메서드 명시(테스트 클래스 종료시 1번만 실행)) @AfterAll
  • setup() : 각 단위테스트 전 마다 실행되는 메서드 @BeforeEach
  • cleanup() : 각 단위테스트 후 마다 실행되는 메서드 @AfterEach

Feature Method

  • 테스트 메서드
def "블라블라를 확인한다"() {
  // blocks go here
}

Block

image

  • given (or setup) : 테스트를 하기 위한 기본 설정작업
  • when : 테스트 코드 실행
  • then : 테스트 코드 검증
  • expect : 테스트 코드 실행 및 검증 (= when + then)
  • where : 테스트 코드에 적용 할 파라미터들 정의
def "사용자 정보를 가져올 수 있다"() {
    given:
    def email = "test@google.com"
    def user = new User()
    user.email = email

    def mockRepo = Mock(UserRepository.class)
    def service = new UserService(mockRepo)

    when:
    def userInfo = service.findByEmail(email)

    then:
    mockRepo.findByEmail(email) >> user
    userInfo.email == email
}
def "Get max value"() {
    expect:
    Math.max(a, b) == c

    where:
    a | b | c
    5 | 1 | 5
    3 | 4 | 4
}
  • Exception Test
    • thrown(ex) : 해당 예외가 발생했는지 확인
def "없는 유저 exception 발생"() {
    given:
    def email = "test@abc"

    when:
    service.findByEmail(email)

    then:
    thrown(UsernameNotFoundException.class)
}

Spock 공식문헌