2013-04-07 13 views
5

私はMockitoモックフレームワークを使ってジェネリッククラスをJavaでモックしています。フレームワークの使い方はドキュメントからははっきりしているようですが、私はジェネリッククラスを嘲笑する例は見つけませんでした。モックフレームワークは、以下の方法が含まれます。ジェネリッククラスのジェネリックメソッド

public static <T> T mock(Class<T> classToMock) { 
    ... 
} 

を私はジェネリック型IState<StateId, Event>を持っていると私は、上記の方法を使用して、それをインスタンス化します。

IState<StateId, Event> mockState = Mockito.mock(IState.class); 

私はこのコードについて、次の警告を得る:

Type safety: The expression of type IState needs unchecked conversion to conform to IState<StateId,Event> 

私は問題が何であるかを知っていると思うが、私は、次の試してみました。 mockメソッドはIStateの型を返しますが、代入する変数は特殊型IState<StateId, Event>なので、私は何とか作成しているクラスが具体的にはIState<StateId, Event>であることを伝える必要がありますが、これは。私は以下のものを試しましたが、それらはすべて構文エラーを出しました。

IState<StateId, Event> mockState = Mockito.mock(IState<StateId, Event>.class); 
IState<StateId, Event> mockState = Mockito.mock(IState.class<StateId, Event>); 
+0

これはテストです(私はmockitoだと思います)。警告を無視することができます。 '.class'に対して' IState。 class'はありません。 –

+0

@RC:それはできますが、これらのことがJavaでどのように処理されるかはまだ不思議です。 – petersohn

答えて

1

javaのジェネリックは、タイプ消去によって実装されます。これは、パラメータ化されたクラスがコンパイラによってチェックされることを意味しますが、実行時には、すべてのクラスは(未互換の理由で)「未処理」です。その結果、IStateを表すClassオブジェクトは1つしかなく、すべての可能なパラメータに対応する無数のクラスではありません。

警告を無効にするには、行の直前に@SuppressWarning("unchecked")を追加します。

+0

しかし、この場合、どのように警告を取り除くのですか? – petersohn

+0

@petersohn私は私の答えを編集しました。 – WilQu

+0

それは '@SuppressWarnings(" unchecked ")'と呼ばれ、メソッドの前に置かなければなりません。また、あまりエレガントではありません。 – petersohn

関連する問題