這一篇介紹在實際使用Spock的過程當中如何把一些經常使用的測試方法抽出來,封裝成基類使用html
在前面幾篇文章講解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的方式引用測試
也能夠放在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