13

我不知道您是否设法仅从标题中弄清楚我要做什么,所以我将尝试用示例进行解释

假设我创建了自己的注释@VerifySomething

我已经为该注释创建了测试类以确保它有效。

现在让我们假设我有一个带有注释SomeClass的字段的类something@VerifySomething

class SomeClass {
    @VerifySomething
    String something;
}

到目前为止一切都很好,但是现在我想test class为我创建,SomeClass但是我没有看到验证某些东西的所有测试用例的任何意义,因为我已经检查@VerifySomething过它应该在测试该注释的类中正常工作,但是我需要确保该字段实际上具有@VerifySomething注释,而无需复制粘贴所有这些测试用例。

所以我的问题是,有没有一种方法可以检查某个字段是否有一个或多个必需的注释,而无需编写我已经在注释测试类中编写的测试用例,以确保它可以正常工作。

4

2 回答 2

19

可以getAnnotation用来判断字段上是否有特定的Annotation,它以注解类为参数:

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。从那里你可以做 _beanDescriptor#getConstraintsForProperty("something") 给你一个PropertyDescriptor。通过propertyDescriptor#getConstraintDescriptors(),您将获得一组ConstraintDescriptors,您可以对其进行迭代以验证是否使用了给定的约束注释。

请注意,与上述答案中的通用反射相比,这是一个特定于 Bean 验证的解决方案,但这取决于您真正追求的是什么。老实说,我还不太了解您的用例。

于 2013-03-05T10:28:54.690 回答