001 package org.junit.runner.notification;
002
003 import java.io.PrintWriter;
004 import java.io.Serializable;
005 import java.io.StringWriter;
006
007 import 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 */
018 public 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 }