注釈付きなどの多くのクラスで作業しています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 機能をカバーしたいかによって、マイレージは異なる場合があります。