All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.junit.rules.ErrorCollector Maven / Gradle / Ivy

package org.junit.rules;

import static org.junit.Assert.assertThat;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;

import org.hamcrest.Matcher;
import org.junit.runners.model.MultipleFailureException;

/**
 * The ErrorCollector rule allows execution of a test to continue after the
 * first problem is found (for example, to collect _all_ the incorrect rows in a
 * table, and report them all at once):
 *
 * 
 * public static class UsesErrorCollectorTwice {
 * 	@Rule
 * 	public ErrorCollector collector= new ErrorCollector();
 *
 * @Test
 * public void example() {
 *      collector.addError(new Throwable("first thing went wrong"));
 *      collector.addError(new Throwable("second thing went wrong"));
 *      collector.checkThat(getResult(), not(containsString("ERROR!")));
 *      // all lines will run, and then a combined failure logged at the end.
 *     }
 * }
 * 
* * @since 4.7 */ public class ErrorCollector extends Verifier { private List errors = new ArrayList(); @Override protected void verify() throws Throwable { MultipleFailureException.assertEmpty(errors); } /** * Adds a Throwable to the table. Execution continues, but the test will fail at the end. */ public void addError(Throwable error) { errors.add(error); } /** * Adds a failure to the table if {@code matcher} does not match {@code value}. * Execution continues, but the test will fail at the end if the match fails. */ public void checkThat(final T value, final Matcher matcher) { checkThat("", value, matcher); } /** * Adds a failure with the given {@code reason} * to the table if {@code matcher} does not match {@code value}. * Execution continues, but the test will fail at the end if the match fails. */ public void checkThat(final String reason, final T value, final Matcher matcher) { checkSucceeds(new Callable() { public Object call() throws Exception { assertThat(reason, value, matcher); return value; } }); } /** * Adds to the table the exception, if any, thrown from {@code callable}. * Execution continues, but the test will fail at the end if * {@code callable} threw an exception. */ public Object checkSucceeds(Callable callable) { try { return callable.call(); } catch (Throwable e) { addError(e); return null; } } }