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

2022-09-01 04:10:47

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

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


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

我想避免将几个“层”称为深,以及类似的丑陋的解决方法。有没有更好的方法?getCause()

显然,Spring有NestedRuntimeException.contains(Class),它做了我想要的 - 但我没有使用Spring。


答案 1

如果您使用的是Apache Commons Lang,那么您可以使用以下内容:

(1)当原因应完全符合规定的类型时

if (ExceptionUtils.indexOfThrowable(exception, ExpectedException.class) != -1) {
    // exception is or has a cause of type ExpectedException.class
}

(2)当原因应为指定类型或其子类类型时

if (ExceptionUtils.indexOfType(exception, ExpectedException.class) != -1) {
    // exception is or has a cause of type ExpectedException.class or its subclass
}

答案 2

为什么要避免 .当然,您可以为自己编写一个方法来执行任务,例如:getCause

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