我正在使用许多带有注释javax.persistence.Entity
等的类。我的项目是关于生成关于 JPA 注释类的元数据而不是自身的持久性,所以我将它们用作测试用例。
我不想启动 Hibernate 或其他一些 JPA 提供程序,而是想以编程方式检查 - 我的单元测试的一部分 - 我的 JPA 声明确实有效。
最简单的方法是什么?
我正在使用许多带有注释javax.persistence.Entity
等的类。我的项目是关于生成关于 JPA 注释类的元数据而不是自身的持久性,所以我将它们用作测试用例。
我不想启动 Hibernate 或其他一些 JPA 提供程序,而是想以编程方式检查 - 我的单元测试的一部分 - 我的 JPA 声明确实有效。
最简单的方法是什么?
只需创建最简单的SessionFactory
或 EclipseLink 或 OpenJPA 提供的任何东西,EntityManagerFactory
然后让他们验证它(如果需要,使用一些虚拟的内存数据库)。重新发明它太复杂了。
对于 Hibernate,这可以使用Configuration.buildMappings
:
@RunWith(Theories.class)
public class EntitiesAreValidTest {
@DataPoints
public static Class<?>[] entities = new Class[] {
SimpleEntity.class,
SimpleEntityWithTransientField.class,
TwoFieldEntity.class
};
@Theory
public void classHasValidConfiguration(Class<?> entityClass) {
new AnnotationConfiguration().addAnnotatedClass(entityClass).buildMappings();
}
}
在测试中使用具体的 JPA 提供程序有什么问题?结合嵌入式数据库(例如 Apache Derby),您可以重用确实已经实现的逻辑。另一个想法是检查 EclipseLink、Hibernate、OpenJPA 的源代码……看看你是否可以直接使用它。
我不确定是否有更简单的方法,但您可以使用反射来访问类的注释
Class class = Example.class;
Annotation[] annotations = class.getAnnotations();
如果您不信任 JPA 提供程序(或不想使用它们),请尝试将使用反射检索到的 JPA 注释(元数据)与使用ResultSetMetaData检索到的 JDBC 元数据进行协调(例如,请参见此处)。
我并不是说这很简单,但是通过正确的方法,您应该拥有一组相当紧凑的辅助方法来检查每个实体的基本定义。里程可能会有所不同,具体取决于您要涵盖多少 JPA 功能。