Java Unit Test - Spock
Spock是Java和Groovy應用程序的測試和規範框架。它脫穎而出是因爲它美麗而富有表現力的規範。
由於其基於JUnit,Spock與大多數IDE,構建工具和持續集成服務器兼容。
Spock的靈感來自JUnit, jMock,RSpec,Groovy,Scala, Vulcans等。
使用Spock需要具有Groovy
和單元測試
的基本知識。
Spock的作用跟Junit一樣,可以與其他模擬框架如Mocktio等結合使用。
1. 使用姿勢
1.1 總覽
gradle依賴:
testCompile group: 'org.spockframework', name: 'spock-core', version: '1.3-groovy-2.5'
import spock.lang.Specification
class ReviewSpock extends Specification {
def "test"() {
given:
def namelist = new ArrayList()
def elem = "Weison"
when:
namelist.add(elem)
then:
!namelist.empty
namelist.size() == 2
namelist.get(0).equals("Weison")
noExceptionThrown()
}
def "test exception"() {
given:
def namelist = new ArrayList()
def elem = "Weison"
when:
namelist.add(elem)
namelist.get(2)
then:
thrown(IndexOutOfBoundsException.class)
}
}
將其中一個驗證改爲:namelist.size() == 2
,看到驗證失敗信息:
Condition not satisfied:
namelist.size() == 2
\| | |
[Weison] 1 false
<Click to see difference>
at com.wxx.st.spock.MyFirstSpecification.test(MyFirstSpecification.groovy:21)
1.2 測試類需繼承Specification
Specification類包含許多用於編寫規範的方法,它指示JUnit使用Sputnik(Spock的JUnit runner)運行規範程序。
Spock下的單元測試類需繼承Specification。
class MyFirstSpecification extends Specification {
// fields
// fixture methods
// feature methods
// helper methods
}
1.3 變量定義
def obj = new ClassUnderSpecification()
def coll = new Collaborator()
1.4 夾具方法
有一下幾個:
def setupSpec() {} // 執行一次 - 在第一個單元測試方法之前
def setup() {} // 執行在每個單元測試方法之前
def cleanup() {} // 執行在每個單元測試方法之後
def cleanupSpec() {} // 執行一次 - 在最後一個單元測試方法之後
如果測試類中重寫了夾具方法,那麼執行順序如下:
- 1 super.setupSpec
- 2 sub.setupSpec
- 3 super.setup
- 4 sub.setup
- 5 單元測試方法
- 6 sub.cleanup
- 7 super.cleanup
- 8 sub.cleanupSpec
- 9 super.cleanupSpec
1.4 測試方法
從概念上講,一種特徵方法包括四個階段:
- 1 設置功能的夾具(可選)
- 2 根據規範爲系統提供激勵
- 3 描述系統預期的響應
- 4 清理功能的夾具(可選)
def "test add an element with exception"() {
// 測試代碼
}
1.5 塊
def "test add an element with exception"() {
// 測試代碼
}
Spock內置支持實現特徵方法的每個概念階段。爲此,特徵方法被構造成所謂的塊。塊以標籤開頭,並延伸到下一個塊的開頭或方法的結尾。有6種模塊:given,when,then,expect,cleanup,和where塊。方法開頭和第一個顯式塊之間的任何語句都屬於隱式given塊。