package de.bechte.junit.runners.context.description; import de.bechte.junit.runners.context.processing.ChildResolver; import de.bechte.junit.runners.model.TestClassPool; import de.bechte.junit.stubs.ContextTestClassStub; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.Description; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.TestClass; import java.util.Arrays; import java.util.List; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.same; import static org.mockito.Mockito.*; public class ContextDescriberTest { private Class contextTestClass; private MethodDescriber methodDescriber; private ChildResolver methodResolver; private ChildResolver<Class<?>> contextResolver; private ContextDescriber describer; @Before public void setUp() throws Exception { contextTestClass = ContextTestClassStub.class; contextResolver = mock(ChildResolver.class); methodResolver = mock(ChildResolver.class); methodDescriber = mock(MethodDescriber.class); describer = new ContextDescriber(contextResolver, methodResolver, methodDescriber); } @Rule public final ExpectedException thrown = ExpectedException.none(); @Test public void whenDescribeIsCalledWithNull_anIllegalArgumentExceptionIsRaised() throws Exception { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Class must not be null!"); describer.describe(null); } @Test public void whenDescribeIsCalled_descriptionHasTheCorrectTestClass() throws Exception { Description description = describer.describe(contextTestClass); assertThat((Class) description.getTestClass(), is(equalTo(contextTestClass))); } @Test public void whenDescribeIsCalled_descriptionHasTheCorrectDisplayName() throws Exception { Description description = describer.describe(contextTestClass); assertThat(description.getDisplayName(), is(equalTo(contextTestClass.getCanonicalName()))); } @Test public void whenDescribeIsCalled_descriptionHasTheCorrectAnnotations() throws Exception { Description description = describer.describe(contextTestClass); assertThat(description.getAnnotations(), containsInAnyOrder(contextTestClass.getAnnotations())); } @Test public void whenDescribeIsCalled_descriptionHasTheCorrectChildren() throws Exception { Description descriptionA = mock(Description.class); Description descriptionB = mock(Description.class); FrameworkMethod outerTestMethod = mock(FrameworkMethod.class); Description descriptionOuterTestMethod = mock(Description.class); SuiteDescriber spiedDescriber = spy(describer); doReturn(descriptionA).when(spiedDescriber).describe(ContextTestClassStub.A.class); doReturn(descriptionB).when(spiedDescriber).describe(ContextTestClassStub.B.class); List<Class<?>> contexts = Arrays.asList(ContextTestClassStub.A.class, ContextTestClassStub.B.class); TestClass testClass = TestClassPool.forClass(ContextTestClassStub.class); when(contextResolver.getChildren(testClass)).thenReturn(contexts); when(methodResolver.getChildren(testClass)).thenReturn(Arrays.asList(outerTestMethod)); when(methodDescriber.describe(outerTestMethod)).thenReturn(descriptionOuterTestMethod); Description description = spiedDescriber.describe(ContextTestClassStub.class); assertThat(description.getChildren(), containsInAnyOrder(descriptionA, descriptionB, descriptionOuterTestMethod)); verify(spiedDescriber).addChildren(any(Description.class), same(testClass)); verify(spiedDescriber).describe(ContextTestClassStub.class); verify(spiedDescriber).describe(ContextTestClassStub.A.class); verify(spiedDescriber).describe(ContextTestClassStub.B.class); } }