Kotlin中使用mockito 2
01-31
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.SessionMockito 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類的醜陋形式好看多了。
推薦閱讀: