原作者,講解 Mockito 2 怎樣用於Kotlin final 類 的測試。 ...
時間:Mar 2, 2017
原文鏈接:https://antonioleiva.com/mockito-2-kotlin/
如我們在前面文章中談到的,Kotlin最常見的問題之一是,在預設情況下,所有類和函數都是關閉的。
這就是說,如果你要mock一個類(這在Java測試中,這些可能是非常普通的),你或是需要用保留字open
將其打開,或是將其提取出一個介面。
這兩種方法都可能是令人厭煩的,事實上他們限制Java開發者使用Kotlin。
幸運的是,Mockito 2 除去了這一限制,今天我計劃教你怎樣做。
那問題是什麼?
想象你在Kotlin中有一個類,它像這樣:
1 class ClosedClass { 2 3 fun doSomething() { 4 } 5 }
你需要測試調用該類的doSomething方法。
其方法是這樣:
1 @Test fun testClosedClass() { 2 val c = Mockito.mock(ClosedClass::class.java) 3 c.doSomething() 4 verify(c).doSomething() 5 }
如果你用 Mockito 1.x版本,你會得到下麵錯誤:
Mockito cannot mock/spy following:
– final classes
– anonymous classes
– primitive types
將更新依賴關係到Mockito 2
如我們所說,Mockito 2 完全能夠mock它,所以我們要更新依賴關係。在編寫這篇文章是,Mockito 2的最新版本是2.8.9。但是,由於它們最近經常更新,請檢查其最新版本。
1 testCompile 'org.mockito:mockito-core:2.8.9'
現在我們再次運行代碼,仍然是失敗!
Mockito cannot mock/spy because :
– final class
雖然,我們根本沒有限制mock匿名類或原始類型,但是它不同於final類。這是為什麼?
這個選項仍是一個實驗性,要求手動激活它。
使能mock final classes選擇
要使能它,你需要在文件夾test/resources/mockito-extensions
下創建org.mockito.plugins.MockMaker
文件:
它是一個簡單的文本文件:
1 mock-maker-inline
再沒其它內容。
現在,你能夠再次測試,並看到它運行正常。非常棒!
Mock屬性
你也能mock屬性,且也沒有問題。例如,如果我們修改這個類的代碼:
1 class ClosedClass(val prop: Int) { 2 3 fun doSomething() { 4 } 5 }
來讓我們看看mock的屬性值:
1 @Test fun testClosedClass() { 2 val c = Mockito.mock(ClosedClass::class.java) 3 `when`(c.prop).thenReturn(3) 4 5 val prop = c.prop 6 assertEquals(3, prop) 7 }
我要求其返回3。其後,我檢查值是正確的。
你也能夠檢查屬性已經被調用:
1 verify(c).prop
結論
如你所見,在最流行mock庫的最新版本中所有限制的消失了。
所以再沒有藉口了!現在就可以使用Kotlin編寫你的所有測試。
請記住,你可以在這本免費指南找到所有這些內容以及更多詳細內容,它將幫助你建立你的第一個項目;或在這本書中,你可以學習怎樣從頭開始創建一個完整的應用程式。