2013-03-04 8 views
8

ich weiß nicht, ob Sie heraus geschaffen, was ich versuche nur aus dem Titel zu tun, so dass ich mit BeispielBestimmen Sie, ob das Feld mit einer bestimmten Anmerkungen kommentiert wird

erklären würde versuchen, Lets Angenommen, ich habe habe meine eigene Anmerkung erstellt @VerifySomething

Und ich habe Testklasse für diese Anmerkung erstellt, um sicherzustellen, dass es funktioniert.

lässt Nehmen wir nun an, dass ich Klasse SomeClass mit Feld something anoted mit Anmerkung @VerifySomething

class SomeClass { 
    @VerifySomething 
    String something; 
} 

So weit so gut, aber jetzt möchte ich test class für meine SomeClass erstellen aber ich sehe keinen Punkt in Überprüfung aller Testfälle von etwas, wie ich bereits überprüft habe, dass @VerifySomething funktioniert wie es sollte in der Klasse, die diese Annotation, aber ich muss sicherstellen, dass Feld tatsächlich @VerifySomething Annotation ohne Kopieren alle diese Testfälle einfügen.

Also meine Frage ist, gibt es eine Möglichkeit zu überprüfen, ob ein Feld eine oder mehrere erforderliche Annotation hat, ohne Testfälle zu schreiben, habe ich bereits in Annotation Test-Klasse geschrieben, um sicherzustellen, dass es so funktioniert, wie es sollte.

Antwort

11

Sie getAnnotation verwenden können, um festzustellen, ob es eine bestimmte Annotation auf dem Feld ist, der die Annotation-Klasse als Parameter übernimmt:

field.getAnnotation(SomeAnnotation.class); 

Hier ist eine Methode, die Sie überprüfen können zu, dass eine Klasse eine hat gegeben durch Anmerkungsfeld kommentierte:

import java.lang.reflect.Field; 
import javax.validation.constraints.NotNull; 
import org.junit.Test; 
import org.springframework.util.Assert; 

public class TestHasAnnotatedField { 
    @Test 
    public void testHasFieldsWithAnnotation() throws SecurityException, NoSuchFieldException { 
     Class<?>[] classesToVerify = new Class[] {MyClass1.class, MyClass2.class}; 
     for (Class<?> clazz : classesToVerify) { 
      Field field = clazz.getDeclaredField("something"); 
      Assert.notNull(field.getAnnotation(NotNull.class)); 
     } 
    } 
    static class MyClass1 { @NotNull String something; } 
    static class MyClass2 { @NotNull String something; } 
} 
2

ich bin nicht sicher, ob ich verfolge, aber falls Sie zu prüfen, ob eine Klasse und oder seine Eigenschaften haben eine Einschränkung Bean Validation angegeben, können Sie die Meta-Daten api verwenden. Der Einstiegspunkt ist Validator # getConstraintsForClass (SomeClass.class). Sie erhalten einen BeanDescriptor. Von dort aus können Sie _beanDescriptor # getConstraintsForProperty ("something") ausführen, was Ihnen einen PropertyDescriptor gibt. Über propertyDescriptor # getConstraintDescriptors() erhalten Sie dann eine Reihe von ConstraintDescriptors, die Sie iterieren können, um zu überprüfen, ob eine Constraint-Annotation verwendet wurde.

Hinweis, dies ist eine Bean Validation spezifische Lösung im Vergleich zu generischen Reflexion wie in der Antwort oben, aber es kommt darauf an, was Sie wirklich wollen. Um ehrlich zu sein, verstehe ich Ihren Anwendungsfall noch nicht ganz.