package de.bechte.junit.runners.validation; import de.bechte.junit.runners.model.TestClassPool; import de.bechte.junit.stubs.validation.ClassWithInvalidConstructorArguments; import de.bechte.junit.stubs.validation.ClassWithInvalidConstructorCount; import de.bechte.junit.stubs.validation.StaticClassWithInvalidConstructor; import org.junit.Before; import org.junit.Test; import org.junit.runners.model.TestClass; import org.mockito.Mock; import org.mockito.Spy; import java.util.ArrayList; import java.util.List; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; public class ConstructorValidatorTest { @Mock private TestClass testClass; @Spy private List<Throwable> errors = new ArrayList<Throwable>(); @Before public void setUp() throws Exception { initMocks(this); } @Test public void staticClassesAreNeverValidated() throws Exception { TestClass testClass1 = TestClassPool.forClass(StaticClassWithInvalidConstructor.PrivateAccessor.class); TestClass testClass2 = TestClassPool.forClass(StaticClassWithInvalidConstructor.InvalidCount.class); ConstructorValidator.VALID_CONSTRUCTOR.validate(testClass1, errors); ConstructorValidator.VALID_CONSTRUCTOR.validate(testClass2, errors); verifyNoMoreInteractions(errors); } @Test public void whenTopLevelClassHasMoreThanOnConstructor_multipleConstructorExceptionIsReported() throws Exception { Class javaClass = ClassWithInvalidConstructorCount.class; when(testClass.getJavaClass()).thenReturn(javaClass); ConstructorValidator.VALID_CONSTRUCTOR.validate(testClass, errors); assertThat(errors, hasSize(1)); assertThat(errors.get(0).getMessage(), is(equalTo("Test class should have exactly one public constructor"))); } @Test public void whenMemberClassHasMoreThanOnConstructor_multipleConstructorExceptionIsReported() throws Exception { Class javaClass = ClassWithInvalidConstructorCount.MemberWithInvalidConstructorCount.class; when(testClass.getJavaClass()).thenReturn(javaClass); ConstructorValidator.VALID_CONSTRUCTOR.validate(testClass, errors); assertThat(errors, hasSize(1)); assertThat(errors.get(0).getMessage(), is(equalTo("Test class should have exactly one public constructor"))); } @Test public void whenTopLevelClassConstructorHasArguments_invalidArgumentCountIsReported() throws Exception { Class javaClass = ClassWithInvalidConstructorArguments.class; when(testClass.getJavaClass()).thenReturn(javaClass); ConstructorValidator.VALID_CONSTRUCTOR.validate(testClass, errors); assertThat(errors, hasSize(1)); assertThat(errors.get(0).getMessage(), is(equalTo("Test class should have exactly one public zero-argument constructor"))); } @Test public void whenMemberClassConstructorHasMoreThanOneArgument_invalidArgumentCountIsReported() throws Exception { Class javaClass = ClassWithInvalidConstructorArguments.MemberWithInvalidArguments.class; when(testClass.getJavaClass()).thenReturn(javaClass); ConstructorValidator.VALID_CONSTRUCTOR.validate(testClass, errors); assertThat(errors, hasSize(1)); assertThat(errors.get(0).getMessage(), is(equalTo("Test class within a hierarchical context should have exactly one public one-argument constructor"))); } }