以前に他の例外によってキャッチされてStandardUncaughtExceptionHandler
いない例外をキャッチするがあります。EventBus
内部では、エラー処理に Guava を使用しています。アプリでスローされるチェック済み例外の種類ごとに、イベント ハンドラーをバスに登録して、その特定の例外の種類を処理します。バスが登録されたハンドラーを持たない例外をポストした場合、バスはその例外をDeadEvent
オブジェクトにラップし、デッド イベントをバスに再ポストします。これStandardUncaughtExceptionHandler
はDeadEvent
s をリッスンするように登録されているため、キャッチされていない例外を常にチェックする方法が保証されます。
主なソースは次のとおりです。
public class StandardUncaughtExceptionHandler implements UncaughtExceptionHandler {
private LoggingService loggingService;
// Getter and setter for logginService.
@Override @Subscribe
public void handleUncaughtException(DeadEvent deadEvent) {
// Log it.
StringBuilder logBuilder = new StringBuilder();
if(deadEvent.getEvent() instanceof Throwable) {
Throwable throwable = (Throwable)deadEvent.getEvent();
logBuilder.append("An uncaught exception occurred: ");
logBuilder.append(throwable.getMessage());
logBuilder.append(" - Stack trace: ");
logBuilder.append(throwable.getStackTrace());
}
else
logBuilder.append("Something weird happened.");
loggingService.error(logBuilder.toString());
}
}
Throwable
そして、それに対する私のテストでは、 を指定すると、正しいログ メッセージが作成されることを確認します。
@Test
public void handleUncaughtExceptionLogsThrowableIfPresent() {
// GIVEN
StandardUncaughtExceptionHandler fixture =
new StandardUncaughtExceptionHandler();
LoggingService mockLoggingService = Mockito.mock(LoggingService.class);
DeadEvent mockDeadEvent = Mockito.mock(DeadEvent.class);
Mockito.doThrow(new RuntimeException("Logging-Throwable"))
.when(mockLoggingService)
.error(Mockito.contains("An uncaught exception occurred:"));
Mockito.doThrow(new RuntimeException("Logging-Something-Else"))
.when(mockLoggingService)
.error(Mockito.contains("Something weird happened."));
Mockito.doReturn(new Throwable()).when(mockDeadEvent).getEvent();
try {
// WHEN
fixture.handleUncaughtException(mockDeadEvent);
Assert.fail();
} catch(RuntimeException rte) {
// THEN
Assert.assertTrue(rte.getMessage().contains("Logging-Throwable"));
}
}
このテストを実行すると、JUnit コンソールに次のエラーが表示されます。
java.lang.NullPointerException
at com.myapp.StandardUncaughtExceptionHandlerTest.handleUncaughtExceptionLogsThrowableIfPresent(StandardUncaughtExceptionHandlerTest.java:63)
... rest of stack trace omitted for brevity, it's huge
Mockito が NPE を引き起こしている理由について何か考えはありますか? 私は確認して再確認しましたが、モックを正しく設定したと思います。前もって感謝します。