أسهل طريقة للتحقق برمجيًا من أن الفصل لديه تعريف JPA صالح
-
20-09-2019 - |
سؤال
أنا أعمل مع العديد من الفصول الدراسية التي تم شرحها javax.persistence.Entity
وما شابه ذلك.يدور مشروعي حول إنشاء بيانات وصفية حول الفئات المشروحة بـ JPA بدلاً من الثبات في حد ذاته، لذلك أستخدمها كحالات اختبار.
بدلاً من تشغيل Hibernate أو أي مزود JPA آخر، أود التحقق برمجيًا - جزء من اختبارات الوحدة الخاصة بي - من أن إعلانات JPA الخاصة بي صالحة بالفعل.
ما هي أسهل طريقة للقيام بذلك؟
المحلول
ومجرد خلق أبسط SessionFactory
ممكن أو أيا كان EclipseLink أو OpenJPA توفير وراء EntityManagerFactory
والسماح لهم التحقق من صحة ذلك (باستخدام بعض دمية قاعدة البيانات في الذاكرة، إذا لزم الأمر). انها معقدة جدا لإعادة اختراعها.
لالسبات وهذا يمكن أن يتم ذلك باستخدام 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 موفر في الاختبارات الخاصة بك؟ في تركيبة مع قاعدة بيانات جزءا لا يتجزأ من (مثل أباتشي دربي) هل يمكن إعادة استخدام المنطق الذي تمت بالفعل تم تنفيذها. وثمة فكرة أخرى يكون للتحقق من مصادر EclipseLink، السبات، OpenJPA، ... لنرى ما إذا كان يمكن استخدامها مباشرة.
وأنا لست متأكدا مما اذا كان هناك طريقة أسهل ولكن يمكنك استخدام التأمل للوصول إلى شروح من فئة
Class class = Example.class;
Annotation[] annotations = class.getAnnotations();
إذا كنت لا تثق بموفري JPA (أو لا ترغب في استخدامها)، فحاول التوفيق بين تعليقات JPA التوضيحية (بيانات التعريف) التي تم استردادها باستخدام الانعكاس مع بيانات تعريف JDBC التي تم استردادها باستخدام ResultSetMetaData (على سبيل المثال انظر هنا).
لا أقصد أن يكون هذا بسيطًا، ولكن باستخدام النهج الصحيح، يجب أن يكون لديك مجموعة مدمجة من الأساليب المساعدة للتحقق من التعريفات الأساسية لكل كيان.وقد يختلف عدد الأميال اعتمادًا على مقدار وظائف JPA التي تريد تغطيتها.