Java Unit Test - Spock

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塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章