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()
例外オブジェクトをメソッドに渡すだけで、メソッド呼び出し中に例外オブジェクトがスローされます。
GO TO FULL VERSION