Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- docker
- 오뚜기숯불소금구이
- State
- SetMail
- 바스트로37
- SpringCamp2017
- Replacation
- NapuCon2016
- NVM
- Java
- Spring
- useEffect
- Hook
- 고릴라볼링장
- react
- 판교
- SpringCamp
- react component
- 전나라동동공주
- SpringCamp2019
- BDD
- 오삼철판볶음
- DockerCompose
- MariaDB
- 진1926
- 양살치살
- SpockFramework
- 신미낙지
- 강다니엘
- nginx
Archives
- Today
- Total
Note
Spock Framework 본문
Spock Framework?
Spock Framework
는 Groovy
언어에서 동작하는 명세
프레임워크로 BDD
를 편하게할 수 있도록 도와준다.Spock
은 Java
와 Groovy
어플리케이션을 위한 명세 프레임워크로 Groovy(DSL)
로 작성하므로 간결하고 직관적인 장점이 있다.
또한, 기존의 Java
의 JUnit
, Hamcrest
, Mockito
를 전부 다 학습하는 것보다 손쉽게 학습할 수 있고,Mock
, Stub
, Spy
등 사용이 편리하고 명세를 작성하기 편리하다.Java
와 Groovy
어플리케이션을 위한 프레임워크이므로 Java
환경에서도 사용할 수 있다.
Lifecycle
- setup: 메소드 실행 전에 실행(given)
- when: 행위에 대한 명세를 작성
- then: 행위에 대한 예측을 작성
- expect: 행위에 대한 명세와 예측을 작성(when + then)
- cleanup: 메소드 실행 후에 실행
- where: 여러 값에 대해 반복행위를 할 때 작성
출처: http://spockframework.org/spock/docs/1.1/spock_primer.html
Example
앞서 BDD
포스트에서 작성한 예시를 Spock
으로 변환하게 되면 아래와 같다.
package kr.pe.nuti.home.api.service.todo
import kr.pe.nuti.home.api.domain.todo.TodoItem
import kr.pe.nuti.home.api.enumeration.todo.TodoState
import kr.pe.nuti.home.api.exception.todo.IllegalStateChangeException
import kr.pe.nuti.home.api.repository.todo.TodoItemRepository
import spock.lang.Issue
import spock.lang.Narrative
import spock.lang.See
import spock.lang.Specification
import spock.lang.Title
@Title("Todo Item의 상태를 변경한다.")
@Narrative("""
Todo Management System을 사용하는 사용자가
Todo Item의 상태관리를 위해서
각각의 Todo Item의 상태를 변경할 수 있다.
상태 변경은 Todo > Doing, Doing > Done,
Done > Doing, Doing > Todo로만 할 수 있다.
""")
class TodoServiceStateChangeSpec extends Specification {
TodoService service
def todoItemRepository
def setup() {
todoItemRepository = Mock(TodoItemRepository)
service = Spy(TodoService)
service.todoItemRepository = todoItemRepository
}
@See(["https://github.com/hyeonil/smart-home-api/issues/6"])
@Issue("#6")
def "Todo상태를 Doing상태로 변경하면 상태가 변경된다."() {
given: "Todo 상태의 Todo Item"
TodoItem savedItem = new TodoItem([idx: 1L, state: TodoState.TODO])
TodoItem changedItem = new TodoItem([idx: 1L, state: TodoState.DOING])
todoItemRepository.findById(_) >> Optional.of(savedItem)
todoItemRepository.save(_) >> changedItem
TodoItem item = new TodoItem([idx: 1L])
when: "Todo Item의 상태를 Doing으로 변경한다."
def result = service.changeState(item, TodoState.DOING)
then: "Todo Item의 상태가 Doing으로 변경된다."
1 * service.getItem(_)
result.state == TodoState.DOING
}
@See(["https://github.com/hyeonil/smart-home-api/issues/6"])
@Issue("#6")
def "Todo상태를 Done상태로 변경하면 상태가 변경되지 않고 예외사항이 발생한다."() {
given: "Todo 상태의 Todo Item"
TodoItem savedItem = new TodoItem([idx: 1L, state: TodoState.TODO])
todoItemRepository.findById(_) >> Optional.of(savedItem)
TodoItem item = new TodoItem([idx: 1L])
when: "Todo Item의 상태를 Done으로 변경한다."
service.changeState(item, TodoState.DONE)
then: "Todo Item의 상태가 변경되지 않고 예외사항이 발생한다."
1 * service.getItem(_)
thrown(IllegalStateChangeException)
}
}
'Dev > Specification' 카테고리의 다른 글
기능요구사항명세(Specification) (0) | 2019.11.24 |
---|---|
BDD (0) | 2019.11.24 |
Comments