ExceptionUtil { public static Throwable getRootCause(@NotNull Throwable t) { return Throwables.getRootCause(t); }  static RuntimeException unchecked(@Nullable Throwable t); static Throwable unwrap(@Nullable Throwable t); static RuntimeException unwrapAndUnchecked(@Nullable Throwable t); static String stackTraceText(@NotNull Throwable t); static String toStringWithShortName(@Nullable Throwable t); static String toStringWithRootCause(@Nullable Throwable t); static Throwable getRootCause(@NotNull Throwable t); static T findCause(@NotNull Throwable throwable, Class<T> cause); @SuppressWarnings("unchecked") static boolean isCausedBy(@Nullable Throwable throwable,
			Class<? extends Exception>... causeExceptionClasses); static T setStackTrace(@NotNull T throwable, Class<?> throwClass, String throwClazz); static T clearStackTrace(@NotNull T throwable);  }
@Test public void getRootCause() { IOException ioexception = new IOException("my exception"); IllegalStateException illegalStateException = new IllegalStateException(ioexception); RuntimeException runtimeException = new RuntimeException(illegalStateException); assertThat(ExceptionUtil.getRootCause(runtimeException)).isSameAs(ioexception); assertThat(ExceptionUtil.getRootCause(ioexception)).isSameAs(ioexception); }