在Kotlin上怎樣用Mockito2 mock final 類(KAD 23)


作者:Antonio Leiva

時間: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編寫你的所有測試。

 

請記住,你可以在這本免費指南找到所有這些內容以及更多詳細內容,它將幫助你建立你的第一個項目;或在這本中,你可以學習怎樣從頭開始創建一個完整的應用程序。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM