001package org.junit.runner.notification;
002
003import java.io.Serializable;
004
005import org.junit.internal.Throwables;
006import org.junit.runner.Description;
007
008/**
009 * A <code>Failure</code> holds a description of the failed test and the
010 * exception that was thrown while running it. In most cases the {@link org.junit.runner.Description}
011 * will be of a single test. However, if problems are encountered while constructing the
012 * test (for example, if a {@link org.junit.BeforeClass} method is not static), it may describe
013 * something other than a single test.
014 *
015 * @since 4.0
016 */
017public class Failure implements Serializable {
018    private static final long serialVersionUID = 1L;
019
020    /*
021     * We have to use the f prefix until the next major release to ensure
022     * serialization compatibility. 
023     * See https://github.com/junit-team/junit4/issues/976
024     */
025    private final Description fDescription;
026    private final Throwable fThrownException;
027
028    /**
029     * Constructs a <code>Failure</code> with the given description and exception.
030     *
031     * @param description a {@link org.junit.runner.Description} of the test that failed
032     * @param thrownException the exception that was thrown while running the test
033     */
034    public Failure(Description description, Throwable thrownException) {
035        this.fThrownException = thrownException;
036        this.fDescription = description;
037    }
038
039    /**
040     * @return a user-understandable label for the test
041     */
042    public String getTestHeader() {
043        return fDescription.getDisplayName();
044    }
045
046    /**
047     * @return the raw description of the context of the failure.
048     */
049    public Description getDescription() {
050        return fDescription;
051    }
052
053    /**
054     * @return the exception thrown
055     */
056
057    public Throwable getException() {
058        return fThrownException;
059    }
060
061    @Override
062    public String toString() {
063        return getTestHeader() + ": " + fThrownException.getMessage();
064    }
065
066    /**
067     * Gets the printed form of the exception and its stack trace.
068     */
069    public String getTrace() {
070        return Throwables.getStacktrace(getException());
071    }
072
073    /**
074     * Gets a the printed form of the exception, with a trimmed version of the stack trace.
075     * This method will attempt to filter out frames of the stack trace that are below
076     * the test method call.
077     */
078    public String getTrimmedTrace() {
079        return Throwables.getTrimmedStackTrace(getException());
080    }
081
082    /**
083     * Convenience method
084     *
085     * @return the message of the thrown exception
086     */
087    public String getMessage() {
088        return getException().getMessage();
089    }
090}