如何测试从数据库中的表生成的实体中注释的完整性?我要做的是测试注释是否存在,并检查它们是否正确填写,例如使用对象数据类型而不是变量。(整型而不是整型)。检查是否使用日历类型而不是日期类型。
目前我可以创建这些表并手动分配注释,如:
@Entity
@Id,
@GeneratedValue(),
@Column(name="columnName"),
@Size(min = 1, max =20, message = "{ClassName.variableName.messageType"}),
@NotNull(message = "{ClassName.variableName.messageType"}),
@Temporal(TemporalType.DATE)...
我试图解决的部分是,我需要检查这些注释的完整性,例如它们是否正确填写,甚至在那里。我要测试的代码是:
@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;
好,假设您想做的事情实际上是有用的,您当然可以列出所有注释,也许使用参数化测试(因为您想对所有类做同样的事情)。
Class<?> clz = Note.class();
Annotation[] annotations = clz.getAnnotations(); // lists all
Table table = clz.getAnnotation(Table.class); // get the Table annotation
当然你也可以对Fields做同样的事情…
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
}
}