java - 如何使用 JUnit 反射测试实体注释

标签 java unit-testing reflection junit annotations

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

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

 @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

当然你可以对字段做同样的事情......

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
    }

}

关于java - 如何使用 JUnit 反射测试实体注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32141071/

相关文章:

java - Java中的switch语句可以使用 "view"作为参数吗?

c# - 使用 NUnit 和 NSubstitute 对通用存储库进行单元测试

c# - 使用反射检查方法是否为 "Extension Method"

c# - System.Reflection.TargetInvocationException;需要帮助理解

android - 在 AOSP 设备上保持 Wifi-Direct 打开

java - 完成xslt新手。如何在xslt 1.0版中合并这2个xml源。应用分组和排序?

java - 有没有办法在不使用文件扩展名的情况下识别 java 中的音频或图像文件?

java - Google App Engine - 尽管我的 CPU 使用率相对较低,但是什么导致冷启动延迟时间较长?

unit-testing - 如何模拟 Grails Domain 类的特定方法?

unit-testing - VS2012 & TFS2012 单元测试主要问题