Spock 테스트 코드
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
-
given
(orsetup
) : 테스트를 하기 위한 기본 설정작업 -
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)
}