Spock 簡介,一個(gè)比Junit豐富的測試框架 (part 3)

今天繼續(xù)聊下spock 的其他特性,如果沒有看到前面的內(nèi)容胸梆,可以點(diǎn)擊這里查看前面的介紹。

1.Mocking

1.1 什么是Mocking

Mocking是一種改變我們的服務(wù)與我們的服務(wù)合作的類的行為的方式须板。 這是一種有效的方法碰镜,可以獨(dú)立測試業(yè)務(wù)邏輯的依賴關(guān)系。

一個(gè)典型的例子就是用一個(gè)簡單的假裝來替換一個(gè)網(wǎng)絡(luò)調(diào)用的類习瑰。

5.2. 用spock 來 Mocking

Spock擁有自己的模擬框架绪颖,利用了Groovy帶給JVM的有趣概念。 首先甜奄,我們來實(shí)例化一個(gè)Mock:

PaymentGateway paymentGateway = Mock()

在這種情況下菠发,我們的模擬類型是由變量類型推斷的。 由于Groovy是一種動(dòng)態(tài)語言贺嫂,我們還可以提供一個(gè)類型參數(shù)滓鸠,使我們不必將模擬分配給任何特定的類型:

def paymentGateway = Mock(PaymentGateway)

現(xiàn)在,無論何時(shí)我們在PaymentGateway模擬中調(diào)用方法第喳,都會(huì)給出默認(rèn)響應(yīng)糜俗,而不會(huì)調(diào)用實(shí)際的實(shí)例:

    when:
    def result = paymentGateway.makePayment(12.99)
 
then:
    result == false

這個(gè)術(shù)語是lenient mocking。 它的意思是未定義的模擬方法將返回合理的默認(rèn)值曲饱,而不是拋出異常悠抹。 這是在Spock中設(shè)計(jì)的,目的是為了使模擬和測試更加健壯扩淀。

1.3 在Mocks上調(diào)用樁方法

我們也可以配置我們的Mock上調(diào)用的方法以某種方式響應(yīng)不同的參數(shù)楔敌。 讓我們嘗試讓我們的PaymentGateway模擬在我們支付20時(shí)返回true

given:
    paymentGateway.makePayment(20) >> true
 
when:
    def result = paymentGateway.makePayment(20)
 
then:
    result == true

這里有趣的是,Spock如何利用Groovy的操作符重載來樁方法調(diào)用驻谆。 對于Java卵凑,我們必須調(diào)用真正的方法,這可能意味著生成的代碼更加冗長胜臊,并且可能不那么富有表現(xiàn)力勺卢。

現(xiàn)在,讓我們嘗試更多類型的樁象对。

如果我們停止關(guān)注我們的方法參數(shù)并始終想要返回true黑忱,則可以使用下劃線:

paymentGateway.makePayment(_) >> true

如果我們想要在不同的響應(yīng)之間進(jìn)行切換,我們可以提供一個(gè)列表,每個(gè)元素將依次返回:

paymentGateway.makePayment(_) >>> [true, true, false, true]
1.4 驗(yàn)證

我們可能想要用Mock來做的另一件事是斷言有不同的方法在預(yù)期的參數(shù)上被調(diào)用甫煞。 換句話說菇曲,我們應(yīng)該驗(yàn)證與我們的模擬的交互。驗(yàn)證的典型用例是如果我們的模擬方法有無效返回類型抚吠。

在這種情況下羊娃,由于沒有結(jié)果讓我們操作,所以我們沒有推測的行為可以通過測試方法進(jìn)行測試埃跷。

一般來說蕊玷,如果返回了一些東西,那么被測試的方法就可以對它進(jìn)行操作弥雹,這就是我們斷言的操作結(jié)果垃帅。讓我們試著驗(yàn)證一個(gè)帶有void返回類型的方法:

def "Should verify notify was called"() {
    given:
        def notifier = Mock(Notifier)
 
    when:
        notifier.notify('foo')
 
    then:
        1 * notifier.notify('foo')
}

Spock正在利用Groovy運(yùn)算符重載。 通過將我們的模擬方法調(diào)用乘以一剪勿,我們說我們期望它被調(diào)用了多少次贸诚。

如果我們的方法根本沒有被調(diào)用或者沒有按照我們指定的次數(shù)被調(diào)用,那么我們的測試將沒有給我們提供一個(gè)信息量很大的Spock錯(cuò)誤消息厕吉。 讓我們通過期待它被調(diào)用兩次來證明這一點(diǎn):

2 * notifier.notify('foo')

在此之后酱固,讓我們看看錯(cuò)誤消息是什么樣的。 我們會(huì)像往常一樣; 這是相當(dāng)豐富的:

Too few invocations for:
 
2 * notifier.notify('foo')   (1 invocation)

就像一樣头朱,我們也可以執(zhí)行更寬松的驗(yàn)證匹配运悲。 如果我們不關(guān)心我們的方法參數(shù)是什么,我們可以使用下劃線:

2 * notifier.notify(_)

或者如果我們想確保它沒有被特定參數(shù)調(diào)用项钮,我們可以使用not操作符:

2 * notifier.notify(!'foo')

總結(jié)

結(jié)合之前的文章班眯,我們通過使用Spock進(jìn)行測試給出了一些小的分片案例,展示了Spock比典型的JUnit更具表現(xiàn)力烁巫。

我們已經(jīng)展示了執(zhí)行數(shù)據(jù)驅(qū)動(dòng)測試是多么容易署隘,以及通過本地Spock功能如何輕松模擬和斷言。更多的Spock的特性亚隙,請查看官方文檔磁餐。

歡迎大家繼續(xù)關(guān)注。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阿弃,一起剝皮案震驚了整個(gè)濱河市诊霹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恤浪,老刑警劉巖畅哑,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肴楷,死亡現(xiàn)場離奇詭異水由,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赛蔫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門砂客,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泥张,“玉大人,你說我怎么就攤上這事鞠值∶拇矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵彤恶,是天一觀的道長钞钙。 經(jīng)常有香客問我,道長声离,這世上最難降的妖魔是什么芒炼? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮术徊,結(jié)果婚禮上本刽,老公的妹妹穿的比我還像新娘。我一直安慰自己赠涮,他們只是感情好子寓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笋除,像睡著了一般斜友。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垃它,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天蝙寨,我揣著相機(jī)與錄音,去河邊找鬼嗤瞎。 笑死墙歪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贝奇。 我是一名探鬼主播虹菲,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掉瞳!你這毒婦竟也來了毕源?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陕习,失蹤者是張志新(化名)和其女友劉穎霎褐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體该镣,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冻璃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片省艳。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娘纷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跋炕,到底是詐尸還是另有隱情赖晶,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布辐烂,位于F島的核電站遏插,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纠修。R本人自食惡果不足惜涩堤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望分瘾。 院中可真熱鬧胎围,春花似錦、人聲如沸德召。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽上岗。三九已至福荸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肴掷,已是汗流浹背敬锐。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呆瞻,地道東北人台夺。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像痴脾,于是被迫代替她去往敵國和親颤介。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容