日々精進

新しく学んだことを書き留めていきます

JUnitのassertThrowsで例外がthrowされることをテストしたらエラーメッセージがログに出る

以下のように、assertThrowsでExceptionがthrowされることをテストする場合。

assertThrows(Exception.class, () -> myObj.method());

想定通りの例外がthrowされた場合でも以下のようなエラーメッセージがログに出るので邪魔くさい。

Exception in thread "pool-14-thread-1" java.lang.RuntimeException: ...

原因は、javaでlambdaを実行すると自動的に別スレッドが起動され、そこでlambda関数が実行され、別スレッドで実行中にcatchされない例外があった場合自動的にエラーメッセージをログに出してしまうため。メインスレッドの方に例外を伝播してくれれば別スレッドでcatchされない場合でもエラーメッセージ出さなくていいと思うが。。

以下のように、一時的にcatchされない例外があってもエラーログを出さないようにして対応した。

Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {});
assertThrows(Exception.class, () -> myObj.method());
Thread.setDefaultUncaughtExceptionHandler(defaultHandler);

参考:

maku77.github.io