package org.junit.internal.matchers; import org.hamcrest.Description; import org.hamcrest.Factory; import org.hamcrest.Matcher; import org.junit.internal.Throwables; /** * A matcher that delegates to throwableMatcher and in addition appends the * stacktrace of the actual Throwable in case of a mismatch. */ public class StacktracePrintingMatcher extends org.hamcrest.TypeSafeMatcher { private final Matcher throwableMatcher; public StacktracePrintingMatcher(Matcher throwableMatcher) { this.throwableMatcher = throwableMatcher; } public void describeTo(Description description) { throwableMatcher.describeTo(description); } @Override protected boolean matchesSafely(T item) { return throwableMatcher.matches(item); } @Override protected void describeMismatchSafely(T item, Description description) { throwableMatcher.describeMismatch(item, description); description.appendText("\nStacktrace was: "); description.appendText(readStacktrace(item)); } private String readStacktrace(Throwable throwable) { return Throwables.getStacktrace(throwable); } @Factory public static Matcher isThrowable( Matcher throwableMatcher) { return new StacktracePrintingMatcher(throwableMatcher); } @Factory public static Matcher isException( Matcher exceptionMatcher) { return new StacktracePrintingMatcher(exceptionMatcher); } }