9

私は Mockito を使用するテスト ケースを作成しており、任意のオブジェクト (私の場合は) を返すjava.beans.PropertyDescriptor動作をモックしたいと考えています。通常、次のように呼び出すだけでそれを行います。getPropertyType()Class<?>String.class

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

ただし、奇妙なことに、これはコンパイルされません。

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

しかし、推論に依存する代わりに型パラメーターを指定すると、次のようになります。

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

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

4

1 に答える 1

13

PropertyDescriptor#getPropertyType()のオブジェクトを返しますClass<?>。ここで、?は「これは型ですが、それが何かはわかりません」という意味です。このタイプを「X」と呼びましょう。そのため、メソッドは のオブジェクトのみを受け入れることができるwhen(mockDescriptor.getPropertyType())を作成します。しかし、コンパイラはこの "X" がどの型であるかを認識していないため、任意の型の a を渡すと不平を言います。これは、コンパイラが a の呼び出しについて不平を言うのと同じ理由だと思います。OngoingStubbing<Class<X>>thenReturn(Class<X>)Class<X>Classadd(...)Collection<?>

メソッドClass<?>の型を明示的に指定する場合、 が を返すと言っているのではなく、 が を返すと言っているのです。次に、コンパイラは、渡すものが何であれ、一致する型であることを確認します。前述の " " を返すので、もちろん指定したものと一致します。whenmockDescriptor.getPropertyType()Class<?>whenOngoingStubbing<Class<?>>whenClass<?>getPropertyType()Class<X>Class<?>

だから基本的に

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

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

私のIDEでは、元のコードのエラーメッセージは

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

それcapture#1-of ?が先ほど説明した「X」です。

于 2012-06-08T17:00:38.913 に答える