package org.testng.asserts; import java.util.Map; import org.testng.collections.Maps; /** * When an assertion fails, don't throw an exception but record the failure. * Calling {@code assertAll()} will cause an exception to be thrown if at * least one assertion failed. */ public class SoftAssert extends Assertion { // LinkedHashMap to preserve the order private final Map<AssertionError, IAssert<?>> m_errors = Maps.newLinkedHashMap(); @Override protected void doAssert(IAssert<?> a) { onBeforeAssert(a); try { a.doAssert(); onAssertSuccess(a); } catch (AssertionError ex) { onAssertFailure(a, ex); m_errors.put(ex, a); } finally { onAfterAssert(a); } } public void assertAll() { if (!m_errors.isEmpty()) { StringBuilder sb = new StringBuilder("The following asserts failed:"); boolean first = true; for (Map.Entry<AssertionError, IAssert<?>> ae : m_errors.entrySet()) { if (first) { first = false; } else { sb.append(","); } sb.append("\n\t"); sb.append(ae.getKey().getMessage()); } throw new AssertionError(sb.toString()); } } }