2016-11-08 13 views
2

私はMockitoを使ってKotlinでジェネリックインターフェイスを模擬しようとしています。しかし、これまで私は自然な解決策を見いださなかった。私は、次のいずれかとXを模擬できKotlinとMockitoとのジェネリックインターフェイスの模擬

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

fun f(x: X<Int>) = 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()

    しかし、私はヘルパー関数を使用する必要はありません。

Mockitoとの汎用インターフェースをモックするためのエレガントで純粋なKotlinの方法はありますか? (私は警告なしで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 2.1もサポートしています。

Upd。 "uncheked cast"に対処するにはReified type parametersを使用してください。

あなたは「しかし私はヘルパー機能を使いたくありません」と言いますが、なぜですか?これはインライン関数なので、コンパイル時にはすべての呼び出しサイトで関数がインライン展開されます。

+0

私はそのライブラリを使用しますが、これはここでは問題ではありません。より直接的な方法で「チェックされていないキャスト」警告を回避する方法があるかどうかを知りたい。 – jhunovis

+0

私はその点を見ていると思います。 Kotlinの問題ではなく、これを表現できないJavaを書いたMockitoインターフェースの問題です。 Mockitoがreified型のパラメータを使用する場合、すべてが問題ありません。 – jhunovis

関連する問題