001 package org.junit.runners.model; 002 003 import java.util.ArrayList; 004 import java.util.Collections; 005 import java.util.List; 006 007 import org.junit.internal.Throwables; 008 009 /** 010 * Collects multiple {@code Throwable}s into one exception. 011 * 012 * @since 4.9 013 */ 014 public class MultipleFailureException extends Exception { 015 private static final long serialVersionUID = 1L; 016 017 /* 018 * We have to use the f prefix until the next major release to ensure 019 * serialization compatibility. 020 * See https://github.com/junit-team/junit4/issues/976 021 */ 022 private final List<Throwable> fErrors; 023 024 public MultipleFailureException(List<Throwable> errors) { 025 this.fErrors = new ArrayList<Throwable>(errors); 026 } 027 028 public List<Throwable> getFailures() { 029 return Collections.unmodifiableList(fErrors); 030 } 031 032 @Override 033 public String getMessage() { 034 StringBuilder sb = new StringBuilder( 035 String.format("There were %d errors:", fErrors.size())); 036 for (Throwable e : fErrors) { 037 sb.append(String.format("\n %s(%s)", e.getClass().getName(), e.getMessage())); 038 } 039 return sb.toString(); 040 } 041 042 /** 043 * Asserts that a list of throwables is empty. If it isn't empty, 044 * will throw {@link MultipleFailureException} (if there are 045 * multiple throwables in the list) or the first element in the list 046 * (if there is only one element). 047 * 048 * @param errors list to check 049 * @throws Exception or Error if the list is not empty 050 */ 051 @SuppressWarnings("deprecation") 052 public static void assertEmpty(List<Throwable> errors) throws Exception { 053 if (errors.isEmpty()) { 054 return; 055 } 056 if (errors.size() == 1) { 057 throw Throwables.rethrowAsException(errors.get(0)); 058 } 059 060 /* 061 * Many places in the code are documented to throw 062 * org.junit.internal.runners.model.MultipleFailureException. 063 * That class now extends this one, so we throw the internal 064 * exception in case developers have tests that catch 065 * MultipleFailureException. 066 */ 067 throw new org.junit.internal.runners.model.MultipleFailureException(errors); 068 } 069 }