package org.junit.validator; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import java.lang.annotation.Annotation; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.junit.Assert.assertThat; public class AnnotationValidatorFactoryTest { @Rule public ExpectedException exception = ExpectedException.none(); @Test public void createAnnotationValidator() { ValidateWith validateWith = SampleTestWithValidator.class.getAnnotation(ValidateWith.class); AnnotationValidator annotationValidator = new AnnotationValidatorFactory().createAnnotationValidator(validateWith); assertThat(annotationValidator, is(instanceOf(Validator.class))); } @Test public void exceptionWhenAnnotationWithNullClassIsPassedIn() { exception.expect(IllegalArgumentException.class); exception.expectMessage("Can't create validator, value is null in " + "annotation org.junit.validator.AnnotationValidatorFactoryTest$ValidatorWithNullValue"); new AnnotationValidatorFactory().createAnnotationValidator(new ValidatorWithNullValue()); } public static class ValidatorWithNullValue implements ValidateWith { public Class<? extends AnnotationValidator> value() { return null; } public Class<? extends Annotation> annotationType() { return ValidateWith.class; } } @ValidateWith(value = Validator.class) public static class SampleTestWithValidator { } public static class Validator extends AnnotationValidator { } @Test public void exceptionWhenAnnotationValidatorCantBeCreated() { ValidateWith validateWith = SampleTestWithValidatorThatThrowsException.class.getAnnotation(ValidateWith.class); exception.expect(RuntimeException.class); exception.expectMessage("Exception received when creating AnnotationValidator class " + "org.junit.validator.AnnotationValidatorFactoryTest$ValidatorThatThrowsException"); new AnnotationValidatorFactory().createAnnotationValidator(validateWith); } @ValidateWith(value = ValidatorThatThrowsException.class) public static class SampleTestWithValidatorThatThrowsException { } public static class ValidatorThatThrowsException extends AnnotationValidator { public ValidatorThatThrowsException() throws InstantiationException { throw new InstantiationException("Simulating exception in test"); } } }