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