Mockitoは、主にJavaがこれらの例外をどのように扱うか、Mockitoがメソッドシグネチャを使用するように設計されている方法のために、チェックされた例外と未確認の例外を異なって処理します。
##チェックされた例外
- 定義:チェックされた例外は、コンパイル時にチェックされる例外です。 「try-catch`ブロックに巻き込まれるか、「スロー」キーワード[3]を使用してメソッド署名で宣言されている必要があります。
-Mockito処理:Mockitoは、Moctsの署名で例外が宣言されている場合にのみ、Mockオブジェクトからチェックされた例外をスローすることができます。宣言されていないチェックされた例外をスローしようとすると、Mockitoは、チェックされた例外がその方法で無効であることを示すメッセージで「MockitoException」をスローします[1] [2]。たとえば、メソッド「void somemethod()がioexceptionをスローする場合、Mockitoを使用して問題なく「ioException」を投げることができます。
##未チェックの例外
- 定義:未チェックの例外は、コンパイル時にチェックされない例外です。通常、プログラミングエラーを示すランタイムの例外またはエラーです[3]。
- 模擬処理:モッキートは、制限なしに未確認の例外を簡単に処理できます。 `thenthrow()`または `dothrow()`を使用して、メソッド署名[1] [2]で宣言する必要なく、「runtimeexception」や「nullpointerexception」などの未確認の例外をシミュレートできます。これにより、予期しない条件のエラー処理をテストするのが簡単になります。
##チェックされた例外のための回避策
メソッドの署名で宣言されていないチェックされた例外をスローする必要がある場合は、Mockitoの `doanswer()`メソッドを使用できます。この方法により、メソッドの署名[4]で宣言されていない例外をスローするなど、模擬メソッドのカスタム動作を定義できます。ただし、このアプローチにはより多くの手動処理が必要であり、一般に `thenthrow()`または `dothrow()`を使用するよりも簡単ではありません。
要約すると、Mockitoのチェックされた例外の取り扱いは、Javaのコンパイル時間チェックに準拠しているため、より制限的になりますが、チェックされていない例外は自由にスローでき、テストで使いやすくなります。
引用:[1] https://blog.sammkinng.in/blogs/checked-exception-is-valid-for-this-method
[2] https://www.toptal.com/java/a-guide-to-everyday-mockito
[3] https://rollbar.com/blog/how-to-handle-checked-exceptions-in-java/
[4] https://stackoverflow.com/questions/3762047/throw-checked-exceptions-from-mocks-with-mockito
[5] https://stackoverflow.com/questions/38852392/mockito-difference-between-thenthrowexception-and-thenthrownew-execti
[6] https://www.reddit.com/r//java/comments/1cct4iq/if_everyone_hates_checked_exceptions_wheres_the//
[7] https://www.janbasktraining.com/community/java/throw-checked-exceptions-from-mocks-----mockito
[8] https://www.youtube.com/watch?v=6-gj2w2ycmi
[9] https://www.browserstack.com/guide/mockito-throw-exception