1 package org.junit.validator; 2 3 import static java.util.Arrays.asList; 4 import static org.hamcrest.CoreMatchers.is; 5 import static org.junit.Assert.assertThat; 6 7 import java.lang.annotation.Inherited; 8 import java.lang.annotation.Retention; 9 import java.lang.annotation.RetentionPolicy; 10 import java.util.Collection; 11 import java.util.List; 12 13 import org.junit.Test; 14 import org.junit.runners.model.FrameworkField; 15 import org.junit.runners.model.FrameworkMethod; 16 import org.junit.runners.model.TestClass; 17 18 public class AnnotationsValidatorTest { 19 public static class ExampleAnnotationValidator extends AnnotationValidator { 20 private static final String ANNOTATED_METHOD_CALLED= "annotated method called"; 21 22 private static final String ANNOTATED_FIELD_CALLED= "annotated field called"; 23 24 private static final String ANNOTATED_CLASS_CALLED= "annotated class called"; 25 26 @Override 27 public List<Exception> validateAnnotatedClass(TestClass testClass) { 28 return asList(new Exception(ANNOTATED_CLASS_CALLED)); 29 } 30 31 @Override 32 public List<Exception> validateAnnotatedField(FrameworkField field) { 33 return asList(new Exception(ANNOTATED_FIELD_CALLED)); 34 } 35 36 @Override 37 public List<Exception> validateAnnotatedMethod(FrameworkMethod method) { 38 return asList(new Exception(ANNOTATED_METHOD_CALLED)); 39 } 40 } 41 42 @Retention(RetentionPolicy.RUNTIME) 43 @Inherited 44 @ValidateWith(ExampleAnnotationValidator.class) 45 public @interface ExampleAnnotationWithValidator { 46 } 47 48 public static class AnnotationValidatorMethodTest { 49 @ExampleAnnotationWithValidator 50 @Test 51 public void test() { 52 } 53 } 54 55 public static class AnnotationValidatorFieldTest { 56 @ExampleAnnotationWithValidator 57 private String field; 58 59 @Test 60 public void test() { 61 } 62 } 63 64 @ExampleAnnotationWithValidator 65 public static class AnnotationValidatorClassTest { 66 @Test 67 public void test() { 68 } 69 } 70 71 @Test 72 public void validatorIsCalledForAClass() { 73 assertClassHasFailureMessage(AnnotationValidatorClassTest.class, 74 ExampleAnnotationValidator.ANNOTATED_CLASS_CALLED); 75 } 76 77 @Test 78 public void validatorIsCalledForAMethod() { 79 assertClassHasFailureMessage(AnnotationValidatorMethodTest.class, 80 ExampleAnnotationValidator.ANNOTATED_METHOD_CALLED); 81 } 82 83 @Test 84 public void validatorIsCalledForAField() { 85 assertClassHasFailureMessage(AnnotationValidatorFieldTest.class, 86 ExampleAnnotationValidator.ANNOTATED_FIELD_CALLED); 87 } 88 89 private void assertClassHasFailureMessage(Class<?> klass, 90 String expectedFailure) { 91 AnnotationsValidator validator= new AnnotationsValidator(); 92 Collection<Exception> errors= validator 93 .validateTestClass(new TestClass(klass)); 94 assertThat(errors.size(), is(1)); 95 assertThat(errors.iterator().next().getMessage(), 96 is(expectedFailure)); 97 } 98 }