Kotlin中使用mockito 2

Kotlin中做unit test,當然是上junit。

寫ut時難免要用到mock,突然發現碰到一個問題:Kotlin中所有class默認是final的,mockito默認是只能通過繼承來修改open類和interface的行為。

但是好在mockito2提供了運行時修改類的final屬性的功能,所以導入關聯。

testCompile "org.mockito:mockito-core:2.12.0"

跑一下試試。

org.mockito.exceptions.base.MockitoException:

Cannot mock/spy class Xxxxxx.Session

Mockito cannot mock/spy because :

- final class

什麼問題?原來final類修改默認未開啟,需要設置一下。

在目錄src/test/resources/mockito-extensions下

創建文件 org.mockito.plugins.MockMaker

內容為

mock-maker-inline

這樣就可以了。

val mockSession = mock(Session::class.java)

這樣mock一個final類。

然後又碰到一個問題,any<T>在java中可以指代null,但是kotlin中不接受非nullable參數的any,導致編譯不通過。這個其實還好辦,全局加一個函數,將null強制轉換為any<T>。

private fun <T> any(): T {

Mockito.any<T>()

return uninitialized()

}

private fun <T> uninitialized(): T = null as T

這樣就可以正常使用mockito了。

順便推薦下mockito-kotlin這個插件,讓kotlin的mock寫起來更容易。(順便也規避了any的問題)

testCompile "com.nhaarman:mockito-kotlin-kt1.1:1.5.0"

可以寫成這樣:

比原先轉換成java類的醜陋形式好看多了。


推薦閱讀:

TAG:Kotlin | 编程语言 | 单元测试 |