2015-08-21 35 views
2

如何测试从DB中的表生成的实体中注释的完整性。 我想要做的是测试是否有注释,并检查它们是否正确填写,如使用对象数据类型而不是变量例如。(整数而不是int)。检查是否使用日历类型而不是日期类型。如何使用JUnit反射测试实体注释

目前我可以创建这些表和手动分配注释,比如:

@Entity 
    @Id, 
    @GeneratedValue(), 
    @Column(name="columnName"), 
    @Size(min = 1, max =20, message = "{ClassName.variableName.messageType"}), 
    @NotNull(message = "{ClassName.variableName.messageType"}), 
    @Temporal(TemporalType.DATE)...  

在那里我试图解决的部分是,我需要检查thesees注释,如诚信,如果他们充满适当地或甚至在那里。 ,我必须要测试的代码是:

@Log 
    @Entity 
    @Table(name = "Notes") 
    @NamedQueries({ 
    @NamedQuery(name = "Note.findAll", query = "SELECT n FROM Note n") }) 
    public class Note implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(generator = "myGen") 
@Column(name = "ID") 
private String id; 

@Column(name = "NOTE_OWNER") 
@Size(min = 0, max = 20, message = "{Notes.owner.Invalid}") 
private String owner; 

@Column(name = "NOTE_CAPTION") 
@Size(min = 0, max = 255, message = "{Notes.caption.Invalid}") 
private String caption;   
+0

你为什么不简单的集成测试,只需用它来访问数据库全班?通过这种方式,您可以验证注释是否按预期工作,而无需亲自解析注释... –

+0

感谢您的答复,其想法是进行单元测试,以强制创建新的类,以便正确设置注释。而不是为创建的每个新类创建一个测试类。 Regards –

回答

1

好吧,假设你想要做什么是真正有用的,你当然可以列表中的所有批注,或许还有一个参数化测试的(只要你想为你的所有课程做同样的事情)。

Class<?> clz = Note.class(); 
Annotation[] annotations = clz.getAnnotations(); // lists all 
Table table = clz.getAnnotation(Table.class); // get the Table annotation 

当然你也可以做同样的事情...领域

Field[] fields = clz.getDeclaredFields(); 
for(Field field : fields) { 
    Annotation[] annotations = field.getAnnotations(); // lists all 
    Column column = clz.getAnnotation(Column.class); // get the Column annotation 
} 

...和方法(相同的代码)。我个人倾向于为每个注释实现特定的规则,而不是试图动态解析所有注释(好吧,我个人不会写一个没有测试它的类,所以我不会有这个问题,但这是另一回事;-)。

对于测试本身...

@RunWith(Parameterized.class) 
public class EntityTest { 

    @Parameters(name = "entity #{index} \"{0}\" must be properly annotated") 
    public static Collection<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
     { Note.class }, 
     { Something.class } 
    }); 
    } 

    private final Class<?> entityClass; 

    public EntityTest(final Class<?> entityClass) { 
    this.entityClass = entityClass; 
    } 

    @Test 
    public void someTest() { 
     // test your entityClasss 
    } 

} 
+0

谢谢你,要去了。 –

相关问题