4.1 メソッドパラメータ

モック オブジェクトに追加された以前のルールは、パラメーターのないメソッドを処理していました。そして、パラメータを持つメソッドのルールを作成するにはどうすればよいでしょうか? さらに、一部のパラメーター値については 1 つの結果があり、他のパラメーター値については別の結果が得られるようにルールを作成したいと考えています。

そうすればあなたにもできます。メソッドが特定のパラメータで特定のものを返すようにしたい場合は、ルールを次のように記述できます。

Mockito.doReturn(result).when(an object).method name(parameter);

よりよく理解するために例を見てみましょう。リストが 10 番目の要素をリクエストする場合は Ivan という名前を返し、500 番目の要素をリクエストする場合は Marya という名前を返すようにします。否や言うほどない。

@ExtendWith(MockitoExtension.class)
class ParamsTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        //adding the first rule
        Mockito.doReturn("Ivan").when(mockList).get(10);
        //adding a second rule
        Mockito.doReturn("Maria").when(mockList).get(500);

        assertEquals("Ivan", mockList.get(10));
        assertEquals("Maria", mockList.get(500));

    }
}

4.2 パラメータテンプレート

そして、すぐに狡猾な同僚が私に質問します。「メソッドに引数が必要だが、どの値に対しても同じ結果を返さなければならない場合はどうなりますか?」。次のようなことは書かないでください。

Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);

いいえ、誰もあなたにそのように書くことを強制していません。任意の引数を持つメソッドに対して機能するルールをモック オブジェクトに追加したい場合は、そのための特別なオブジェクトがあります。

Mockito.any()

これを使用した例は次のように記述されます。

Mockito.doReturn("Ivan").when(mockList).get(any(int.class));

ここにはいくつかのニュアンスがあります。オブジェクトにMockito.any()は type があるObjectため、さまざまなタイプのパラメータに類似したものがあります。

方法 パラメータの種類
1 どれでも() nullを含むオブジェクト
2 任意(クラス名.クラス) クラス名
3 anyInt() 整数
4 anyBoolean() ブール値
5 anyDouble() ダブル
6 anyList() リスト

より正確には、この例は次のようになります。

Mockito.doReturn("Ivan").when(mockList).get(anyInt());

4.3 doAnswer() メソッド

仮想メソッドの複雑な動作に到達しました。遅かれ早かれ、この仮想メソッドに複雑な動作をさせたい状況が発生するでしょう。たとえば、パラメータに応じて値を返し、文字列を大文字に変換する必要があります。

この - には特別なメソッドがありdoAnswer()、必要なことを行う関数が渡されます。

Mockito.doAnswer(function).when(an object).method name(parameter);

get()クラスメソッドが、List渡された引数の二乗を返すようにしましょう。そして、次のようなプログラムを書きます。

@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
    @Mock
    List mockList;

    @Test
    public void whenMockAnnotation() {
        Mockito.doAnswer(invocation -> {
            int parameter = invocation.getArgument(0);
            return parameter * parameter;
        }).when(mockList).get(anyInt());

        assertEquals(100, mockList.get(10));
        assertEquals(25, mockList.get(5));
    }
}

Answer クラスのオブジェクトを使用して関数を定義しました。