3.1 doReturn() メソッド

さあ、魔法がかかります...

偽のモック オブジェクトを作成したが、それが何らかの形で動作する必要があるとします。特定のメソッドが呼び出されたとき、何か重要なことが行われたか、メソッドが特定の結果を返しました。何をすべきか?

Mockito ライブラリを使用すると、目的の動作をモック オブジェクトに追加できます。

特定のメソッドが呼び出されたときにモック オブジェクトが特定の結果を返すようにしたい場合は、次のコードを使用してこの「ルール」をオブジェクトに追加できます。

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

メソッド呼び出しの最後では、method name?実際には呼び出しは行われていません。このメソッドはdoReturn()特別なプロキシ オブジェクトを返し、これを利用してオブジェクトのメソッドの呼び出しを監視し、ルールが記述されます。

また。これは、モック オブジェクトに追加するルールを記述する非常に賢い方法です。このようなコードを見たときに頭の中で正しく解釈するには、ある程度のスキルが必要です。経験がついてきます。

具体例が必要だと思います。モック クラス オブジェクトを作成しArrayList、そのメソッドにsize()数値 10 を返すように指示してみましょう。完全なコードは次のようになります。

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

    @Test
    public void whenMockAnnotation () {
         //create a rule: return 10 when calling the size method
        Mockito.doReturn(10).when(mockList).size();

        //the method is called here and will return 10!!
        assertEquals(10, mockList.size());
    }
}

はい、このコードは機能します。テストは失敗しません。

3.2 when() メソッド

動作ルールをモック オブジェクトに追加する別の方法があります。それは、 を呼び出すことですMockito.when()。次のようになります。

Mockito.when(an object.method name()).thenReturn(result);

これは、前のものと同じモック オブジェクト動作ルールの記述方法です。比較:

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

ここでも全く同じことが起こります - 新しいルールの構築です。

確かに、最初の例には 2 つのマイナス点があります。

  • 電話は非常に混乱します。an object.method name()
  • メソッドがmethodname()を返した場合は機能しませんvoid

さて、私たちのお気に入りの例を使って書き留めてみましょうMockito.when()

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

    @Test
    public void whenMockAnnotation() {
        //create a rule: return 10 when calling the size method
        Mockito.when(mockList.size() ).thenReturn(10);

        //the method is called here and will return 10!!
        assertEquals(10, mockList.size());
    }
}

3.3 doThrow() メソッド

私たちは、モック オブジェクト メソッドが特定の結果を返すようにする方法を考え出しました。特定の例外をスローさせるにはどうすればよいですか? に送ってくださいdoReturn()?

メソッドが戻らないようにするには、つまり例外をスローするには、 を使用してルールを設定する必要がありますdoThrow()

Mockito.doThrow(exception.class).when(an object).method name();

そして 2 番目のオプション:

Mockito.when(an object.method name()).thenThrow(exception.class);

ちょっと期待できますよね?

そうですね、あなたはすでに理解し始めています。例を使って修正してみましょう。

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

    @Test
    public void whenMockAnnotation() {
        Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
        mockList.size(); //an exception will be thrown here
    }
}

特定の例外オブジェクトをスローする必要がある場合は、次のフォームの構築を使用します。

Mockito.doThrow(new Exception()).when(an object).method name();

doThrow()例外オブジェクトをメソッドに渡すだけで、メソッド呼び出し中に例外オブジェクトがスローされます。