package org.junit.tests.running.classes; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import java.util.List; import org.hamcrest.Matcher; import org.junit.Test; import org.junit.internal.matchers.TypeSafeMatcher; import org.junit.runner.Description; import org.junit.runner.JUnitCore; import org.junit.runner.Request; import org.junit.runner.Result; import org.junit.runner.manipulation.Filter; import org.junit.runner.notification.RunNotifier; import org.junit.runners.BlockJUnit4ClassRunner; import org.junit.runners.ParentRunner; import org.junit.runners.model.InitializationError; import org.junit.runners.model.RunnerScheduler; import org.junit.tests.experimental.rules.RuleFieldValidatorTest.TestWithNonStaticClassRule; import org.junit.tests.experimental.rules.RuleFieldValidatorTest.TestWithProtectedClassRule; public class ParentRunnerTest { public static String log= ""; public static class FruitTest { @Test public void apple() { log+= "apple "; } @Test public void banana() { log+= "banana "; } } @Test public void useChildHarvester() throws InitializationError { log= ""; ParentRunner runner= new BlockJUnit4ClassRunner(FruitTest.class); runner.setScheduler(new RunnerScheduler() { public void schedule(Runnable childStatement) { log+= "before "; childStatement.run(); log+= "after "; } public void finished() { log+= "afterAll "; } }); runner.run(new RunNotifier()); assertEquals("before apple after before banana after afterAll ", log); } @Test public void testMultipleFilters() throws Exception { JUnitCore junitCore= new JUnitCore(); Request request= Request.aClass(ExampleTest.class); Request requestFiltered= request.filterWith(new Exclude("test1")); Request requestFilteredFiltered= requestFiltered .filterWith(new Exclude("test2")); Result result= junitCore.run(requestFilteredFiltered); assertThat(result.getFailures(), isEmpty()); assertEquals(1, result.getRunCount()); } private Matcher> isEmpty() { return new TypeSafeMatcher>() { public void describeTo(org.hamcrest.Description description) { description.appendText("is empty"); } @Override public boolean matchesSafely(List item) { return item.size() == 0; } }; } private static class Exclude extends Filter { private String methodName; public Exclude(String methodName) { this.methodName= methodName; } @Override public boolean shouldRun(Description description) { return !description.getMethodName().equals(methodName); } @Override public String describe() { return "filter method name: " + methodName; } } public static class ExampleTest { @Test public void test1() throws Exception { } @Test public void test2() throws Exception { } @Test public void test3() throws Exception { } } @Test public void failWithHelpfulMessageForProtectedClassRule() { assertClassHasFailureMessage(TestWithProtectedClassRule.class, "The @ClassRule 'temporaryFolder' must be public."); } @Test public void failWithHelpfulMessageForNonStaticClassRule() { assertClassHasFailureMessage(TestWithNonStaticClassRule.class, "The @ClassRule 'temporaryFolder' must be static."); } private void assertClassHasFailureMessage(Class klass, String message) { JUnitCore junitCore= new JUnitCore(); Request request= Request.aClass(klass); Result result= junitCore.run(request); assertThat(result.getFailureCount(), is(2)); //the second failure is no runnable methods assertThat(result.getFailures().get(0).getMessage(), is(equalTo(message))); } }