13

タイトルだけで何をしようとしているのか理解できたかどうかわからないので、例を挙げて説明します

独自の注釈を作成したとしましょう@VerifySomething

そして、そのアノテーションが機能することを確認するためのテストクラスを作成しました。

ここで、注釈が付けSomeClassられたフィールドを持つクラスがあるとしましょうsomething@VerifySomething

class SomeClass {
    @VerifySomething
    String something;
}

これまでのところ非常に良いですが、今はtest class自分のために作成したいと思っていますが、その注釈をテストするクラスで正常に機能することSomeClassを既に確認しているため、何かのすべてのテストケースを検証する意味がありませんが、これらすべてのテストケースをコピーして貼り付けることなく@VerifySomething、フィールド何かに実際に注釈があることを確認してください。@VerifySomething

だから私の質問は、あるフィールドに1つ以上の必要な注釈があるかどうかを確認する方法はありますか?

4

2 に答える 2

19

getAnnotationフィールドに特定の注釈があるかどうかを判断するために使用できます。これは、注釈クラスをパラメーターとして受け取ります。

field.getAnnotation( SomeAnnotation.class );

クラスに特定のアノテーションでアノテーションが付けられたフィールドがあることを確認するために使用できるメソッドは次のとおりです。

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; }
}
于 2013-03-04T21:16:22.807 に答える
3

私がフォローしているかどうかはわかりませんが、クラスまたはそのプロパティに特定の Bean Validation 制約があるかどうかを確認したい場合は、メタデータ API を使用できます。エントリ ポイントはValidator#getConstraintsForClass(SomeClass.class)です。BeanDescriptorを取得します。そこから、PropertyDescriptorを提供する _beanDescriptor#getConstraintsForProperty("something") を実行できます。propertyDescriptor#getConstraintDescriptors()を介して、一連のConstraintDescriptorsを取得します。これを反復して、特定の制約アノテーションが使用されたことを確認できます。

これは、上記の回答のように一般的なリフレクションと比較した Bean Validation 固有のソリューションですが、実際に何を求めているかによって異なります。正直なところ、私はあなたのユースケースをまだよく理解していません。

于 2013-03-05T10:28:54.690 に答える