2016-11-08 101 views
2

我想嘲笑使用Mockito的Kotlin的通用接口。但到目前爲止,我沒有找到自然的解決辦法。鑑於:嘲笑Kotlin和Mockito的通用接口

interface X<T> { 
    fun x(): T 
} 

fun f(x: X<Int>) = x.x() 

我可以嘲笑X任何如下:

  1. val x = f(Mockito.mock(X::class.java) as X<Int>)

    但是,這將產生一個 「未投」 的警告。

  2. @Mock lateinit var x: X<Int>

    但我不希望因爲我喜歡我的領域最終使用@Mock註解。

  3. 介紹一個輔助功能,爲mockito-kotlin library做:

    inline fun <reified T : Any> mock(): T = Mockito.mock(T::class.java)!!

    然後調用它像這樣:

    val x: X<Int> = mock()

    但我不希望使用的輔助函數。

是否有一個優雅的純Kotlin方式來模擬Mockito的通用接口? (我寧願1的版本沒有警告。)

+0

爲什麼你不想使用幫助函數? 'val x = f(模擬>())'有什麼問題? – mfulton26

+0

因爲它感覺就像是一個解決方法,用於「未經檢查的轉換」問題。有沒有辦法解決這個問題? – jhunovis

+1

我沒有看到[reified type parameters](https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters)作爲解決「未檢查轉換」問題的解決方法。實際上,我將「未經檢查的轉換」問題看作是(Java)解決方法,不具有通用類型參數(或類似的東西)。 – mfulton26

回答

2

只需使用mockito-kotlin項目。這個項目包含所有必須的mockito幫手。並支持mockito 2.1。

Upd。爲了處理「不加鍵演員」,使用Reified type parameters

你說「但我不想使用幫助函數。」,但爲什麼?這是內聯函數,因此在編譯時函數將在所有呼叫站點內聯。

+0

我確實使用該庫,但這不是問題。我確實想知道是否有一種更直接的方式解決「未經檢查的投射」警告。 – jhunovis

+0

我想我明白了。這不是Kotlin的問題,而是用Java編寫的Mockito接口,無法表達這一點。如果Mockito會使用物化類型參數,一切都會好的。 – jhunovis