1. ホーム
  2. java

[解決済み】Mockitoでモックからチェックされた例外を投げる

2022-01-23 05:04:30

質問

あるメソッドが呼ばれたときに、モックオブジェクトの1つがチェック済みのExceptionを投げるようにしようとしています。次のように試しています。

@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
    List<String> list = mock(List.class);
    when(list.get(0)).thenThrow(new SomeException());
    String test = list.get(0);
}

public class SomeException extends Exception {
}

しかし、それでは次のようなエラーが発生します。

org.testng.TestException: 
Expected exception com.testing.MockitoCheckedExceptions$SomeException but got org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: com.testing.MockitoCheckedExceptions$SomeException

を見てみると Mockitoのドキュメント のみを使用しています。 RuntimeException Mockitoでモックオブジェクトからchecked Exceptionsを投げることはできないのでしょうか?

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

のJava APIを確認してください。 リスト .
get(int index) メソッドだけが投げられると宣言されています。 IndexOutOfBoundException を拡張する RuntimeException .
Mockitoに例外を投げるように指示しようとしています。 SomeException() というのは その特定のメソッド呼び出しによってスローされるのは妥当ではない .

さらに明確にするために
リスト インターフェースは、チェックされた Exception を get(int index) というメソッドがあり、それがMockitoが失敗する理由です。
を作成すると モックされたリスト の場合、Mockitoは リストの定義 .class を使ってモックを作成します。

で指定している動作は when(list.get(0)).thenThrow(new SomeException()) は、List API のメソッドシグネチャと一致しません。 というのも get(int index) メソッドは SomeException() ということで、Mockitoは失敗します。

どうしてもそうしたいのであれば、Mockitoに new RuntimeException() を投げるか、もっと良いのは new ArrayIndexOutOfBoundsException() なぜなら、APIはそれが投げられるべき唯一の有効なExceptionであることを指定しているからです。