1 package org.junit.internal.builders; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.junit.runner.Runner; 6 import org.junit.runner.RunnerSpy; 7 import org.junit.runners.model.RunnerBuilder; 8 import org.junit.runners.model.RunnerBuilderStub; 9 10 import static org.hamcrest.core.Is.is; 11 import static org.hamcrest.core.IsEqual.equalTo; 12 import static org.hamcrest.core.IsInstanceOf.instanceOf; 13 import static org.hamcrest.core.IsNull.nullValue; 14 import static org.junit.Assert.assertThat; 15 16 public class AnnotatedBuilderTest { 17 private AnnotatedBuilder builder = new AnnotatedBuilder(new RunnerBuilderStub()); 18 19 @Test 20 public void topLevelTestClassWithoutAnnotation_isRunWithDefaultRunner() throws Exception { 21 Runner runner = builder.runnerForClass(Object.class); 22 assertThat(runner, is(nullValue())); 23 } 24 25 @Test 26 public void topLevelTestClassWithAnnotation_isRunWithAnnotatedRunner() throws Exception { 27 Runner runner = builder.runnerForClass(OuterClass.class); 28 assertThat(runner, is(instanceOf(RunnerSpy.class))); 29 30 RunnerSpy runnerSpy = (RunnerSpy) runner; 31 assertThat(runnerSpy.getInvokedTestClass(), is(equalTo((Class) OuterClass.class))); 32 } 33 34 @Test 35 public void memberClassInsideAnnotatedTopLevelClass_isRunWithTopLevelRunner() throws Exception { 36 Runner runner = builder.runnerForClass(OuterClass.InnerClassWithoutOwnRunWith.class); 37 assertThat(runner, is(instanceOf(RunnerSpy.class))); 38 39 RunnerSpy runnerSpy = (RunnerSpy) runner; 40 assertThat(runnerSpy.getInvokedTestClass(), is(equalTo((Class) OuterClass.InnerClassWithoutOwnRunWith.class))); 41 } 42 43 @Test 44 public void memberClassDeepInsideAnnotatedTopLevelClass_isRunWithTopLevelRunner() throws Exception { 45 Runner runner = builder.runnerForClass(OuterClass.InnerClassWithoutOwnRunWith.MostInnerClass.class); 46 assertThat(runner, is(instanceOf(RunnerSpy.class))); 47 48 RunnerSpy runnerSpy = (RunnerSpy) runner; 49 assertThat(runnerSpy.getInvokedTestClass(), is(equalTo((Class) OuterClass.InnerClassWithoutOwnRunWith.MostInnerClass.class))); 50 } 51 52 @Test 53 public void annotatedMemberClassInsideAnnotatedTopLevelClass_isRunWithOwnRunner() throws Exception { 54 Runner runner = builder.runnerForClass(OuterClass.InnerClassWithOwnRunWith.class); 55 assertThat(runner, is(instanceOf(InnerRunner.class))); 56 57 RunnerSpy runnerSpy = (RunnerSpy) runner; 58 assertThat(runnerSpy.getInvokedTestClass(), is(equalTo((Class) OuterClass.InnerClassWithOwnRunWith.class))); 59 } 60 61 @Test 62 public void memberClassDeepInsideAnnotatedMemberClass_isRunWithParentMemberClassRunner() throws Exception { 63 Runner runner = builder.runnerForClass(OuterClass.InnerClassWithOwnRunWith.MostInnerClass.class); 64 assertThat(runner, is(instanceOf(InnerRunner.class))); 65 66 RunnerSpy runnerSpy = (RunnerSpy) runner; 67 assertThat(runnerSpy.getInvokedTestClass(), is(equalTo((Class) OuterClass.InnerClassWithOwnRunWith.MostInnerClass.class))); 68 } 69 70 @RunWith(RunnerSpy.class) 71 public static class OuterClass { 72 public class InnerClassWithoutOwnRunWith { 73 @Test 74 public void test() { 75 } 76 77 public class MostInnerClass { 78 @Test 79 public void test() { 80 } 81 } 82 } 83 84 @RunWith(InnerRunner.class) 85 public class InnerClassWithOwnRunWith { 86 @Test 87 public void test() { 88 } 89 90 public class MostInnerClass { 91 @Test 92 public void test() { 93 } 94 } 95 } 96 } 97 98 public static class InnerRunner extends RunnerSpy { 99 public InnerRunner(Class testClass) { 100 super(testClass); 101 } 102 103 public InnerRunner(Class testClass, RunnerBuilder runnerBuilder) { 104 super(testClass, runnerBuilder); 105 } 106 } 107 }