Spock單元測試框架實戰指南八 - 經常使用mock封裝成基類

這一篇介紹在實際使用Spock的過程當中如何把一些經常使用的測試方法抽出來,封裝成基類使用html

BaseSpock

在前面幾篇文章講解Spock結合power mock實現靜態方法mock功能時,示例代碼裏常常會用到LogUtils等工具類的靜態方法去記錄日誌,那咱們就能夠把LogUtils類的mock代碼抽到一個公共類中,而後咱們的測試類去繼承咱們本身實現的公共類java

好比咱們把公共類起名叫BaseSpock.groovy文件,那麼繼承它的子類就擁有了模擬LogUtils靜態方法的功能,而不用每一個測試類單獨去實現mock LogUtils日誌的功能函數

代碼以下:工具

/**
 * Spock基類
 * @Author: www.javakk.com
 * @Description: 公衆號:Java老K
 */
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([LogUtils.class])
@SuppressStaticInitializationFor(["com.javakk.spock.util.LogUtils"])
class BaseSpock extends Specification{

    void setup() {
        println "Spock setup"
        // mock掉一些項目中經常使用的類,好比日誌記錄
        PowerMockito.mockStatic(LogUtils.class)
        ......
    }
}

BaseSpock是咱們封裝的spock基類,它繼承Specification,在setUp方法內部對LogUtils進行了mock單元測試

BaseSpock能夠放在一個公共的項目中或做爲jar的方式引用測試

image

也能夠放在src/main/groovy/下面做爲一個公共類調用spa

而後原來用到LogUtils日誌類的單元測試能夠繼承BaseSpock基類日誌

class UserServiceStaticTest extends BaseSpock {

這樣原來的單元測試就不用再去實現mock LogUtils日誌類靜態方法的功能了code

若是你除了LogUtils這些經常使用的類須要mock外,還須要mock其餘的靜態方法的話,使用前面介紹的spock結合power mock的用法便可,相似下面這樣寫:htm

@PrepareForTest([IDNumberUtils.class])
class UserServiceStaticTest extends BaseSpock {

當前的單元測試類須要mock IDNumberUtils類,可使用@PrepareForTest註解,這樣既可使用基類mock LogUtils日誌的功能,也能夠給本身的單測類增長新的靜態方法mock功能

有幾點須要注意:

BaseSpock的類型是groovy文件,這個是由於Spock內置的測試引擎在啓動時會檢查繼承它的子類是不是groovy類型的文件,因此若是你要封裝一個相似BaseSpock的基類,文件後綴不能是 .java的,必須是 .groovy的類型

全部的Spock單測類不能有本身的構造函數,由於單元測試的實例都是由Spock建立和管理的

Spock單元測試代碼的運行順序是:

setupSpec()setup()cleanup()cleanupSpec()

  • setupSpec 相似於Junit的 @beforeClass
  • setup 相似於Junit的 @before
  • cleanup 相似於Junit的 @after
  • cleanupSpec 相似於Junit的 @afterClass

文章來源:http://javakk.com/309.html

相關文章
相關標籤/搜索