2012-06-08 7 views
9

java.beans.PropertyDescriptorを使ったテストケースを作成しています。getPropertyType()の動作を擬似して、任意のClass<?>オブジェクトを返すようにしたいケース、String.class)。Mockito.when()とジェネリック型推論の奇妙なジェネリックエッジケース

cannot find symbol method thenReturn(java.lang.Class<java.lang.String>) 

をしかし、私は代わりに推論に依存の型パラメータを指定した場合::

// we already did an "import static org.mockito.Mockito.*" 
when(mockDescriptor.getPropertyType()).thenReturn(String.class); 

をしかし、奇妙なことに、これはコンパイルされません。通常、私はちょうど呼び出すことによってそれを行うだろう

Mockito.<Class<?>>when(mockDescriptor.getPropertyType()).thenReturn(String.class); 

すべてが大変です。この場合、コンパイラがwhen()の戻り値の型を正しく推測できないのはなぜですか?私はそのような前にパラメータを指定する必要はありませんでした。

答えて

13

PropertyDescriptor#getPropertyType()Class<?>というオブジェクトを返します。?は「これは型ですが、わかりません」という意味です。このタイプを「X」としましょう。したがってwhen(mockDescriptor.getPropertyType())は、OngoingStubbing<Class<X>>を作成します。その方法は、thenReturn(Class<X>)は、Class<X>のオブジェクトのみを受け入れることができます。しかしコンパイラはこの "X"の型がわからないので、Classのいずれかがの型を渡すことについてあなたは不平を言うでしょう。コンパイラがCollection<?>add(...)と呼んでいるのと同じ理由が考えられます。あなたが明示的にwhen法上のタイプのためのClass<?>を指定すると

、あなたはmockDescriptor.getPropertyType()あなたはwhenOngoingStubbing<Class<?>>を返すことを言っている、Class<?>を返すことを言っていません。次に、コンパイラは、whenに渡すものがClass<?>と一致するタイプであることを確認します。 getPropertyType()は先に述べた「Class<X>」を返すので、指定したClass<?>と一致します。私のIDEで

そこで、基本的

// the inferred type is Class<"some type"> 
Mockito.when(mockDescriptor.getPropertyType()) 

// the specified type is Class<"any type"> 
Mockito.<Class<?>>when(mockDescriptor.getPropertyType()) 

、元のコードのエラーメッセージがcapture#1-of ?が、私は上記の "X" であることを

The method thenReturn(Class<capture#1-of ?>) in the type OngoingStubbing<Class<capture#1-of ?>> is not applicable for the arguments (Class<String>) 

です。

関連する問題