سؤال

لقد جئت من معسكر الربيع ، لا أريد استخدام الربيع ، وأنا أنقل إلى Javaee6 ، لكن لدي مشكلة في اختبار Dao + JPA ، إليك عينة مبسطة:

public interface PersonDao
{
  public Person get(long id);
}

هذا داو أساسي للغاية ، لأنني جئت من الربيع ، أعتقد أن داو لا يزال لديه قيمته ، لذلك قررت إضافة طبقة داو.

public class PersonDaoImpl implements PersonDao , Serializable
{
  @PersistenceContext(unitName = "test", type = PersistenceContextType.EXTENDED)
  EntityManager entityManager ;

  public PersonDaoImpl()
  {
  }

  @Override
  public Person get(long id)
  {
    return entityManager .find(Person.class , id);
  }
}

هذا هو DAO الذي تم تنفيذه JPA ، وآمل أن تكون حاوية EE أو حاوية الاختبار قادرة على حقن ContityManager (تمامًا مثل الربيع).

public class PersonDaoImplTest extends TestCase
{
  @Inject 
  protected PersonDao personDao;

  @Override
  protected void setUp() throws Exception
  {
    //personDao = new PersonDaoImpl();
  }

  public void testGet()
  {
    System.out.println("personDao = " + personDao); // NULL !
    Person p = personDao.get(1L);
    System.out.println("p = " + p);
  }
}

هذا هو ملف الاختبار الخاص بي.

حسنًا ، هنا تأتي المشكلة: لأن Junit لا يفهم @javax.inject.inject ، لن يتمكن Persondao من حقنها ، وسوف يفشل الاختبار.

كيف أجد إطارًا اختبارًا قادرًا على حقن ContityManager إلى persondaoimpl ، و injected the persondaoimpl إلى persondao من testcase؟

لقد جربت Unitils.org ، لكن لا يمكنني العثور على عينة كهذه ، إنها فقط حقن EntityManagerFactory إلى testcast ، وليس ما أريد ...

هل كانت مفيدة؟

المحلول

لأنني جئت من الربيع ، أعتقد أن داو لا يزال لديه قيمته ، لذلك قررت إضافة طبقة داو.

لا أرى حقًا ما علاقة الربيع بهذا. وأنا لا أوافق كما كتبت في إجابة سابقة. بالنسبة لي ، JPA عبارة عن DAL (طبقة الوصول إلى البيانات) ، ولا أرى نقطة وضع طبقة الوصول إلى البيانات أعلى طبقة الوصول إلى البيانات الأخرى. على الأقل ليس بشكل منهجي. ولكن دعونا لا نناقش هذا.

هذا هو DAO الذي تم تنفيذه JPA ، وآمل أن تكون حاوية EE أو حاوية الاختبار قادرة على حقن ContityManager (تمامًا مثل الربيع).

إذا كان DAO الخاص بك مكونًا مُدارًا مثل الفول المدارة CDI ، فيجب أن تكون حاوية Java EE قادرة على حقن EntityManager فيه.

ل وحدة التجارب من الكائنات التي تديرها الحاويات ، لا تحتاج إلى أي نوع من الحاويات. ل اختبار التكامل, ، ستحتاج إلى نوع من الحاويات ، تمامًا كما تفعل لكيانات الربيع ، أو كيانات السبات/JPA ، أو حبوب الجلسة ، أو الفاصوليا المدارة CDI أو أي نوع آخر من الكائنات التي تديرها الحاويات. يمكنك استخدم واجهة برمجة تطبيقات EJB3.1 للتضمين في اختباراتك. إلقاء نظرة أيضًا على arquillian.

نصائح أخرى

يمكنك أيضا إضافة طريقة PersonDaoImpl.setEntityManager(EntityManager em), ثم اضبطه Persistence.createEntityManagerFactory("test").createEntityManager(). لا شيء مع حاوية Java EE.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top