一尘不染

检查某个异常类型是否是嵌套异常中的原因的最佳方法?

java

我正在编写一些JUnit测试,以验证是否抛出了类型MyCustomException异常。但是,此异常多次包装在其他异常中,例如InvocationTargetException中,而InvocationTargetException又包装在RuntimeException中。

确定MyCustomException是否导致我实际捕获的异常的最佳方法是什么?我想做这样的事情(见下划线):

try {
    doSomethingPotentiallyExceptional();
    fail("Expected an exception.");
} catch (RuntimeException e) {
     if (!e.原因(MyCustomException.class)
        fail("Expected a different kind of exception.");
}

我想避免称呼getCause()一些“层”较深的类似的变通方法。有更好的方法吗?

(显然,Spring具有NestedRuntimeException.contains(Class),它可以满足我的要求,但我没有使用Spring。)

关闭: 好的,我想实际上没有解决实用程序方法的问题:-)感谢所有回答!


阅读 250

收藏
2020-12-03

共1个答案

一尘不染

你为什么要避免getCause。当然,您可以为自己编写一种执行任务的方法,例如:

public static boolean isCause(
    Class<? extends Throwable> expected,
    Throwable exc
) {
   return expected.isInstance(exc) || (
       exc != null && isCause(expected, exc.getCause())
   );
}
2020-12-03