1. ホーム
  2. java

[解決済み] モッキート ワイルドカードを含む型を返すメソッドをスタブする

2022-05-08 08:44:49

質問

このコードを考えてみましょう。

public class DummyClass {
    public List<? extends Number> dummyMethod() {
        return new ArrayList<Integer>();
    }
}

public class DummyClassTest {
    public void testMockitoWithGenerics() {
        DummyClass dummyClass = Mockito.mock(DummyClass.class);
        List<? extends Number> someList = new ArrayList<Integer>();
        Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
    }
}

の動作をスタブ化しようとしている行について、コンパイラが文句を言う。 dummyMethod() . ワイルドカードを含む型を返すメソッドをスタブする方法について、何かご指摘はありますか?

どのように解決するのですか?

また、タイプセーフでない方法 doReturn を使用します。

@Test
public void testMockitoWithGenerics()
{
    DummyClass dummyClass = Mockito.mock(DummyClass.class);
    List<? extends Number> someList = new ArrayList<Integer>();

    Mockito.doReturn(someList).when(dummyClass).dummyMethod();

    Assert.assertEquals(someList, dummyClass.dummyMethod());
}

として 議論 Mockitoのgoogleグループにて。

よりもシンプルですが thenAnswer しかし、これは型安全でないことに注意してください。 もし、型安全性にこだわるなら、ミルハウスの 回答 が正しいです。

その他の詳細

はっきり言って、観測されたコンパイラーエラーは以下の通りです。

The method thenReturn(List<capture#1-of ? extends Number>) in the type OngoingStubbing<List<capture#1-of ? extends Number>> is not applicable for the arguments (List<capture#2-of ? extends Number>)

の間にコンパイラが最初のワイルドカードの型を割り当てているのだと思います。 when を呼び出した後、2 番目のワイルドカードの型が thenReturn の呼び出しは同じです。

のように見えます。 thenAnswer はワイルドカードを受け付けるので、この問題は発生しません。 thenReturn はワイルドカードでない型を取るので、キャプチャする必要があります。 Mockitoの オンゴーイングスタビング ,

OngoingStubbing<T> thenAnswer(Answer<?> answer);
OngoingStubbing<T> thenReturn(T value);